00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <string.h>
00004 #include "tri.h"
00005 #include "pgm.h"
00006 #include "Pgm.def.h"
00007
00008 main::main(CkArgMsg *m)
00009 {
00010 mesh = CProxy_chunk::ckNew();
00011
00012 CkGetChareID(&mainhandle);
00013 CProxy_main M(mainhandle);
00014
00015 if (m->argc != 2)
00016 CmiAbort("Usage: tri <meshfile>\n");
00017 CkPrintf("Opening file %s...\n", m->argv[1]);
00018
00019 readMesh(m->argv[1]);
00020 M.performRefinements();
00021 }
00022
00023 void main::readMesh(char *filename)
00024 {
00025 FILE *fp;
00026 int numC, cid, numNodes, numEdges, numElements, i, j, k;
00027 intMsg *im;
00028 nodeMsg *nm;
00029 edgeMsg *edm;
00030 elementMsg *elm;
00031
00032 CkPrintf("Reading mesh from file %s... \n", filename);
00033 fp = fopen(filename, "r");
00034 fscanf(fp, "%d", &numC);
00035 CkPrintf("%d chunk(s)...", numC);
00036
00037 CkPrintf("\n ...Reading chunks...\n");
00038 for (i=0; i<numC; i++) {
00039 fscanf(fp, "%d", &cid);
00040 fscanf(fp, "%d%d%d", &numNodes, &numEdges, &numElements);
00041 CkPrintf("Chunk %d has %d nodes, %d edges, %d elements.\n", cid,
00042 numNodes, numEdges, numElements);
00043
00044 im = new intMsg;
00045 im->anInt = numC;
00046 mesh[cid].insert(im);
00047 for (j=0; j<numNodes; j++) {
00048 nm = new nodeMsg;
00049 fscanf(fp, "%lf%lf", &nm->x, &nm->y);
00050 mesh[cid].addNode(nm);
00051 }
00052 for (j=0; j<numEdges; j++) {
00053 edm = new edgeMsg;
00054 for (k=0; k<2; k++)
00055 fscanf(fp, "%d%d", &edm->nodes[k].idx, &edm->nodes[k].cid);
00056 for (k=0; k<2; k++)
00057 fscanf(fp, "%d%d", &edm->elements[k].idx, &edm->elements[k].cid);
00058 mesh[cid].addEdge(edm);
00059 }
00060 for (j=0; j<numElements; j++) {
00061 elm = new elementMsg;
00062 for (k=0; k<3; k++)
00063 fscanf(fp, "%d%d", &elm->nodes[k].idx, &elm->nodes[k].cid);
00064 for (k=0; k<3; k++)
00065 fscanf(fp, "%d%d", &elm->edges[k].idx, &elm->edges[k].cid);
00066 mesh[cid].addElement(elm);
00067 }
00068 }
00069 mesh.doneInserting();
00070
00071 fclose(fp);
00072 CkPrintf("\nDone.\n");
00073 }
00074
00075 void main::performRefinements()
00076 {
00077 refineMsg *rm = new refineMsg;
00078 coarsenMsg *cm = new coarsenMsg;
00079 doubleMsg *dm;
00080 int i;
00081
00082 CkPrintf("Awaiting mesh construction completion...\n");
00083
00084 CkWaitQD();
00085 mesh.deriveBorderNodes();
00086 CkWaitQD();
00087
00088 CkPrintf("Printing start mesh... \n");
00089 for (i=0; i<5; i++)
00090 mesh[i].print();
00091 CkWaitQD();
00092 CkPrintf("Beginning meshing around... \n");
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 mesh[0].improve();
00107 CkWaitQD();
00108 CkPrintf("Printing mesh after improvement... \n");
00109 for (i=0; i<5; i++)
00110 mesh[i].print();
00111 CkWaitQD();
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 mesh.freshen();
00191 CkWaitQD();
00192
00193 for (int p=0; p<200; p++) {
00194 dm = new doubleMsg;
00195 dm->idx = p;
00196 dm->aDouble = 0.07;
00197 mesh[0].resetTargetArea(dm);
00198 }
00199
00200 cm->idx = 208;
00201 cm->area = 0.07;
00202 mesh[0].coarsenElement(cm);
00203
00204 CkWaitQD();
00205 CkPrintf("Printing mesh after 1st coarsen... \n");
00206 for (i=0; i<5; i++)
00207 mesh[i].print();
00208 CkWaitQD();
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 CkPrintf("Done meshing around... exiting.\n");
00245 CkExit();
00246 }