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 }