Changeset 3378
- Timestamp:
- 04/02/10 15:06:53 (15 years ago)
- Location:
- issm/trunk/src
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/ConfigureObjectsx/ConfigureObjectsx.cpp
r3373 r3378 18 18 extern int my_rank; 19 19 20 _printf_(" Configuring elements...\n");20 //_printf_(" Configuring elements...\n"); 21 21 elements->Configure(elements,loads,nodes,materials,parameters); 22 _printf_(" Configuring loads...\n"); 23 //if (my_rank==2){ 24 // nodes->Echo(); 25 //} 22 //_printf_(" Configuring loads...\n"); 26 23 loads->Configure(elements,loads,nodes,materials,parameters); 27 _printf_(" Configuring nodes...\n");24 //_printf_(" Configuring nodes...\n"); 28 25 nodes->Configure(elements,loads,nodes,materials,parameters); 29 _printf_(" Configuring parameters...\n");26 //_printf_(" Configuring parameters...\n"); 30 27 parameters->Configure(elements,loads, nodes, materials,parameters); 31 28 -
issm/trunk/src/c/ModelProcessorx/Prognostic2/CreateElementsNodesAndMaterialsPrognostic2.cpp
r3373 r3378 2 2 * CreateElementsNodesAndMaterialsPrognostic2.c: 3 3 */ 4 5 4 6 5 #include "../../DataSet/DataSet.h" … … 10 9 #include "../../shared/shared.h" 11 10 #include "../../include/macros.h" 11 #include "../../include/typedefs.h" 12 12 #include "../../MeshPartitionx/MeshPartitionx.h" 13 13 #include "../IoModel.h" 14 15 14 16 15 void CreateElementsNodesAndMaterialsPrognostic2(DataSet** pelements,DataSet** pnodes, DataSet** pmaterials, IoModel* iomodel,ConstDataHandle iomodel_handle){ … … 21 20 22 21 /*DataSets: */ 23 DataSet* 24 DataSet* 25 DataSet* 22 DataSet* elements = NULL; 23 DataSet* nodes = NULL; 24 DataSet* materials = NULL; 26 25 27 26 /*Objects: */ 28 Node* 29 Tria* 30 Penta* 31 Matice* 32 Matpar* 27 Node* node = NULL; 28 Tria* tria = NULL; 29 Penta* penta = NULL; 30 Matice* matice = NULL; 31 Matpar* matpar = NULL; 33 32 34 33 /*output: */ … … 124 123 int gridcount; 125 124 int count; 125 /*Nodes cloning*/ 126 double e1,e2; 127 int i1,i2; 128 int pos; 126 129 #endif 127 130 int first_grid_index; … … 183 186 #endif 184 187 185 186 188 /*ids: */ 187 189 tria_id=i+1; //matlab indexing. … … 233 235 234 236 }//for (i=0;i<numberofelements;i++) 235 236 237 237 238 /*Free data : */ 238 xfree((void**)&iomodel->elements);239 239 xfree((void**)&iomodel->thickness); 240 240 xfree((void**)&iomodel->surface); … … 249 249 250 250 #ifdef _PARALLEL_ 251 /*From the element partitioning, we can determine which grids are on the inside of this cpu's 252 *element partition, and which are on its border with other nodes:*/ 253 gridborder=NewVec(3*iomodel->numberofelements); 254 255 for (i=0;i<3*iomodel->numberofelements;i++){ 256 if(my_grids[i])VecSetValue(gridborder,i,1,ADD_VALUES); 251 /*If we are in parallel, we must add the nodes that are not in this partition 252 * but share edges of elements that are in this partition. This is needed for 253 * the loads as numerical fluxes involve the dofs of all nodes on a given edge*/ 254 255 /*Get edges and elements*/ 256 IoModelFetchData(&iomodel->edges,&iomodel->numberofedges,NULL,iomodel_handle,"edges"); 257 258 /*!All elements have been partitioned above, only create elements for this CPU: */ 259 for (i=0;i<iomodel->numberofedges;i++){ 260 261 /*Get left and right elements*/ 262 e1=iomodel->edges[4*i+2]-1; //edges are [node1 node2 elem1 elem2] 263 e2=iomodel->edges[4*i+3]-1; //edges are [node1 node2 elem1 elem2] 264 265 /* 1) If the element e1 is in the current partition 266 * 2) and if the edge of the element is shared by another element 267 * 3) and if this element is not in the same partition: 268 * we must clone the nodes on this partition so that the loads (Numericalflux) 269 * will have access to their properties (dofs,...)*/ 270 if(my_rank==epart[(int)e1] && !isnan(e2) && my_rank!=epart[(int)e2]){ 271 272 /*1: Get vertices ids*/ 273 i1=(int)iomodel->edges[4*i+0]; 274 i2=(int)iomodel->edges[4*i+1]; 275 276 /*2: Get the column where these ids are located in the index*/ 277 pos==UNDEF; 278 for(j=0;j<3;j++){ 279 if (iomodel->elements[3*(int)e2+j]==i1) pos=j+1; 280 } 281 ISSMASSERT(pos!=UNDEF); 282 283 /*3: We have the id of the elements and the position of the vertices in the index 284 * we can now create the corresponding nodes:*/ 285 my_grids[(int)e2*3+pos-1]=1; 286 my_grids[(int)e2*3+((pos+1)%3)]=1; 257 287 } 258 VecAssemblyBegin(gridborder); 259 VecAssemblyEnd(gridborder); 260 261 #ifdef _ISSM_DEBUG_ 262 VecView(gridborder,PETSC_VIEWER_STDOUT_WORLD); 263 #endif 264 265 VecToMPISerial(&my_bordergrids,gridborder); 266 267 #ifdef _ISSM_DEBUG_ 268 if(my_rank==0){ 269 for (i=0;i<iomodel->numberofnodes;i++){ 270 printf("Grid id %i Border grid %lf\n",i+1,my_bordergrids[i]); 271 } 272 } 273 #endif 288 } 289 290 /*Free data: */ 291 xfree((void**)&iomodel->edges); 292 293 /*From the element partitioning, we can determine which nodes are on the inside of this cpu's 294 *element partition, and which are on its border with other nodes:*/ 295 gridborder=NewVec(3*iomodel->numberofelements); 296 297 for (i=0;i<3*iomodel->numberofelements;i++){ 298 if(my_grids[i])VecSetValue(gridborder,i,1,ADD_VALUES); 299 } 300 VecAssemblyBegin(gridborder); 301 VecAssemblyEnd(gridborder); 302 303 VecToMPISerial(&my_bordergrids,gridborder); 304 274 305 #endif 275 306 … … 295 326 materials->AddObject(matpar); 296 327 297 /*Ok, let's summarise. Now, every CPU has the following two arrays: my_grids, and my_bordergrids.328 /*Ok, let's summarise. Now, every CPU has the following array: my_grids 298 329 We can therefore determine which grids are internal to this node's partition 299 330 and which ones are shared with other nodes because they are on the border of this node's partition. Knowing … … 307 338 IoModelFetchData(&iomodel->uppernodes,NULL,NULL,iomodel_handle,"uppergrids"); 308 339 } 309 IoModelFetchData(&iomodel->elements,NULL,NULL,iomodel_handle,"elements");310 340 IoModelFetchData(&iomodel->x,NULL,NULL,iomodel_handle,"x"); 311 341 IoModelFetchData(&iomodel->y,NULL,NULL,iomodel_handle,"y"); … … 318 348 IoModelFetchData(&iomodel->gridoniceshelf,NULL,NULL,iomodel_handle,"gridoniceshelf"); 319 349 320 321 350 /*Get number of dofs per node: */ 322 351 DistributeNumDofs(&node_numdofs,iomodel->analysis_type,iomodel->sub_analysis_type); … … 328 357 #ifdef _PARALLEL_ 329 358 /*!All elements have been partitioned above, only create elements for this CPU: */ 330 if(my_ rank==epart[i]){359 if(my_grids[3*i+j]){ 331 360 #endif 332 361 333 //Get id of the vertex on which the current node is located 334 k=(int)*(iomodel->elements+elements_width*i+j)-1; //(Matlab to C indexing) 335 ISSMASSERT(k>=0 && k<iomodel->numberofnodes); 336 337 //Get node properties 338 node_id=i*3+j+1; 339 node_partitionborder=0; 340 node_x[0]=iomodel->x[k]; 341 node_x[1]=iomodel->y[k]; 342 node_x[2]=iomodel->z[k]; 343 node_sigma=(iomodel->z[k]-iomodel->bed[k])/(iomodel->thickness[k]); 344 node_onbed=(int)iomodel->gridonbed[k]; 345 node_onsurface=(int)iomodel->gridonsurface[k]; 346 node_onshelf=(int)iomodel->gridoniceshelf[k]; 347 node_onsheet=(int)iomodel->gridonicesheet[k]; 348 if (strcmp(iomodel->meshtype,"3d")==0){ 349 if (isnan(iomodel->uppernodes[k])){ 350 node_upper_node_id=node_id; //nodes on surface do not have upper nodes, only themselves. 362 //Get id of the vertex on which the current node is located 363 k=(int)*(iomodel->elements+elements_width*i+j)-1; //(Matlab to C indexing) 364 ISSMASSERT(k>=0 && k<iomodel->numberofnodes); 365 366 //Get node properties 367 node_id=i*3+j+1; 368 #ifdef _PARALLEL_ 369 if(my_bordergrids[node_id-1]>1.0) { //this grid belongs to a partition border 370 node_partitionborder=1; 351 371 } 352 372 else{ 353 node_ upper_node_id=(int)iomodel->uppernodes[k];373 node_partitionborder=0; 354 374 } 355 } 356 else{ 357 /*If we are running 2d, upper_node does not mean much. Just point towards itself!:*/ 358 node_upper_node_id=node_id; 359 } 360 361 /*Create node using its constructor: */ 362 node=new Node(node_id,node_partitionborder,node_numdofs,node_x,node_sigma,node_onbed,node_onsurface,node_upper_node_id,node_onshelf,node_onsheet); 363 364 /*Add node to nodes dataset: */ 365 nodes->AddObject(node); 366 375 #else 376 node_partitionborder=0; 377 #endif 378 node_x[0]=iomodel->x[k]; 379 node_x[1]=iomodel->y[k]; 380 node_x[2]=iomodel->z[k]; 381 node_sigma=(iomodel->z[k]-iomodel->bed[k])/(iomodel->thickness[k]); 382 node_onbed=(int)iomodel->gridonbed[k]; 383 node_onsurface=(int)iomodel->gridonsurface[k]; 384 node_onshelf=(int)iomodel->gridoniceshelf[k]; 385 node_onsheet=(int)iomodel->gridonicesheet[k]; 386 if (strcmp(iomodel->meshtype,"3d")==0){ 387 if (isnan(iomodel->uppernodes[k])){ 388 node_upper_node_id=node_id; //nodes on surface do not have upper nodes, only themselves. 389 } 390 else{ 391 node_upper_node_id=(int)iomodel->uppernodes[k]; 392 } 393 } 394 else{ 395 /*If we are running 2d, upper_node does not mean much. Just point towards itself!:*/ 396 node_upper_node_id=node_id; 397 } 398 399 /*Create node using its constructor: */ 400 node=new Node(node_id,node_partitionborder,node_numdofs,node_x,node_sigma,node_onbed,node_onsurface,node_upper_node_id,node_onshelf,node_onsheet); 401 402 /*Add node to nodes dataset: */ 403 nodes->AddObject(node); 367 404 #ifdef _PARALLEL_ 368 405 } -
issm/trunk/src/c/ModelProcessorx/Prognostic2/CreateLoadsPrognostic2.cpp
r3371 r3378 28 28 int numericalflux_id; 29 29 int numericalflux_node_ids[MAX_NUMERICALFLUX_NODES]; 30 int numericalflux_elem_id s[MAX_NUMERICALFLUX_ELEMS];30 int numericalflux_elem_id; 31 31 32 32 /*Create loads: */ … … 58 58 strcpy(numericalflux_type,"internal"); 59 59 60 numericalflux_elem_ids[0]=(int)e1+1;//id is in matlab index 61 numericalflux_elem_ids[1]=(int)e2+1;//id is in matlab index 60 numericalflux_elem_id=(int)e1+1;//id is in matlab index 62 61 63 62 /*Now, we must get the nodes of the 4 nodes located on the edge*/ … … 85 84 strcpy(numericalflux_type,"boundary"); 86 85 87 numericalflux_elem_id s[0]=(int)e1+1;86 numericalflux_elem_id=(int)e1+1; 88 87 89 88 /*1: Get vertices ids*/ … … 104 103 } 105 104 106 numericalflux = new Numericalflux(numericalflux_id,numericalflux_type,numericalflux_node_ids,numericalflux_elem_id s);105 numericalflux = new Numericalflux(numericalflux_id,numericalflux_type,numericalflux_node_ids,numericalflux_elem_id); 107 106 108 107 loads->AddObject(numericalflux); -
issm/trunk/src/c/objects/Node.cpp
r3372 r3378 220 220 idxm=(id-1); 221 221 value=(double)doflist1[0]; 222 ISSMASSERT(value>=0); 222 223 223 224 VecSetValues(partition,1,&idxm,&value,INSERT_VALUES); -
issm/trunk/src/c/objects/Numericalflux.cpp
r3371 r3378 17 17 #include "./objects.h" 18 18 19 extern int my_rank; 20 19 21 /*Object constructors and destructor*/ 20 22 /*FUNCTION Numericalflux::Numericalflux(){{{1*/ … … 24 26 /*}}}*/ 25 27 /*FUNCTION Numericalflux::Numericalflux(char numericalflux_type[NUMERICALFLUXSTRING],int numericalflux_fill...){{{1*/ 26 Numericalflux::Numericalflux(int numericalflux_id,char numericalflux_type[NUMERICALFLUXSTRING], int numericalflux_node_ids[MAX_NUMERICALFLUX_NODES],int numericalflux_element_id s[MAX_NUMERICALFLUX_ELEMS]){28 Numericalflux::Numericalflux(int numericalflux_id,char numericalflux_type[NUMERICALFLUXSTRING], int numericalflux_node_ids[MAX_NUMERICALFLUX_NODES],int numericalflux_element_id){ 27 29 28 30 int i; … … 30 32 strcpy(type,numericalflux_type); 31 33 id=numericalflux_id; 32 33 for(i=0;i<MAX_NUMERICALFLUX_ELEMS;i++){ 34 element_ids[i]=numericalflux_element_ids[i]; 35 element_offsets[i]=UNDEF; 36 elements[i]=NULL; 37 } 34 35 element_id=numericalflux_element_id; 36 element_offset=UNDEF; 37 element=NULL; 38 38 39 39 for(i=0;i<MAX_NUMERICALFLUX_NODES;i++){ … … 73 73 memcpy(&id,marshalled_dataset,sizeof(id));marshalled_dataset+=sizeof(id); 74 74 75 memcpy(&element_id s,marshalled_dataset,sizeof(element_ids));marshalled_dataset+=sizeof(element_ids);76 memcpy(&element_offset s,marshalled_dataset,sizeof(element_offsets));marshalled_dataset+=sizeof(element_offsets);77 for(i=0;i<MAX_NUMERICALFLUX_ELEMS;i++)elements[i]=NULL;75 memcpy(&element_id,marshalled_dataset,sizeof(element_id));marshalled_dataset+=sizeof(element_id); 76 memcpy(&element_offset,marshalled_dataset,sizeof(element_offset));marshalled_dataset+=sizeof(element_offset); 77 element=NULL; 78 78 79 79 memcpy(&node_ids,marshalled_dataset,sizeof(node_ids));marshalled_dataset+=sizeof(node_ids); … … 105 105 memcpy(marshalled_dataset,&id,sizeof(id));marshalled_dataset+=sizeof(id); 106 106 107 memcpy(marshalled_dataset,&element_id s,sizeof(element_ids));marshalled_dataset+=sizeof(element_ids);108 memcpy(marshalled_dataset,&element_offset s,sizeof(element_offsets));marshalled_dataset+=sizeof(element_offsets);107 memcpy(marshalled_dataset,&element_id,sizeof(element_id));marshalled_dataset+=sizeof(element_id); 108 memcpy(marshalled_dataset,&element_offset,sizeof(element_offset));marshalled_dataset+=sizeof(element_offset); 109 109 110 110 memcpy(marshalled_dataset,&node_ids,sizeof(node_ids));marshalled_dataset+=sizeof(node_ids); … … 120 120 return sizeof(type)+ 121 121 sizeof(id)+ 122 sizeof(element_id s)+123 sizeof(element_offset s)+122 sizeof(element_id)+ 123 sizeof(element_offset)+ 124 124 sizeof(node_ids)+ 125 125 sizeof(node_offsets)+ … … 142 142 if (strcmp(type,"internal")==0){ 143 143 ResolvePointers((Object**)nodes,node_ids,node_offsets,4,nodesin); 144 ResolvePointers((Object**)elements,element_ids,element_offsets,2,elementsin);145 144 } 146 145 else if (strcmp(type,"boundary")==0){ 147 146 ResolvePointers((Object**)nodes,node_ids,node_offsets,2,nodesin); 148 ResolvePointers((Object**)elements,element_ids,element_offsets,1,elementsin);149 147 } 150 148 else ISSMERROR("type not supported yet"); 149 ResolvePointers((Object**)&element,&element_id,&element_offset,1,elementsin); 151 150 152 151 } … … 176 175 printf(" id: %i\n",id); 177 176 177 printf(" element_id=%i\n",element_id); 178 printf(" element_offset=%i\n",element_offset); 179 if(element)element->Echo(); 178 180 if (strcmp(type,"internal")==0){ 179 printf(" element_ids=[%i,%i]\n",element_ids[0],element_ids[1]);180 printf(" element_offsets=[%i,%i]\n",element_offsets[0],element_offsets[1]);181 for(i=0;i<2;i++){182 if(elements[i])elements[i]->Echo();183 }184 181 printf(" node_ids=[%i,%i,%i,%i]\n",node_ids[0],node_ids[1],node_ids[2],node_ids[3]); 185 182 printf(" node_offsets=[%i,%i,%i,%i]\n",node_offsets[0],node_offsets[1],node_offsets[2],node_offsets[3]); … … 189 186 } 190 187 else{ 191 printf(" element_ids=[%i,%i]\n",element_ids[0],element_ids[1]);192 printf(" element_offsets=[%i,%i]\n",element_offsets[0],element_offsets[1]);193 for(i=0;i<1;i++){194 if(elements[i])elements[i]->Echo();195 }196 188 printf(" node_ids=[%i,%i,%i,%i]\n",node_ids[0],node_ids[1],node_ids[2],node_ids[3]); 197 189 printf(" node_offsets=[%i,%i,%i,%i]\n",node_offsets[0],node_offsets[1],node_offsets[2],node_offsets[3]); … … 215 207 printf(" id: %i\n",id); 216 208 209 printf(" element_id=%i\n",element_id); 210 printf(" element_offset=%i]\n",element_offset); 211 217 212 if (strcmp(type,"internal")==0){ 218 printf(" element_ids=[%i,%i]\n",element_ids[0],element_ids[1]);219 printf(" element_offsets=[%i,%i]\n",element_offsets[0],element_offsets[1]);220 213 printf(" node_ids=[%i,%i,%i,%i]\n",node_ids[0],node_ids[1],node_ids[2],node_ids[3]); 221 214 printf(" node_offsets=[%i,%i,%i,%i]\n",node_offsets[0],node_offsets[1],node_offsets[2],node_offsets[3]); 222 215 } 223 216 else{ 224 printf(" element_ids=%i\n",element_ids[0]);225 printf(" element_offsets=%i\n",element_offsets[0]);226 217 printf(" node_ids=[%i,%i]\n",node_ids[0],node_ids[1]); 227 218 printf(" node_offsets=[%i,%i]\n",node_offsets[0],node_offsets[1]); -
issm/trunk/src/c/objects/Numericalflux.h
r3371 r3378 24 24 25 25 /*elements: */ 26 Element* element s[MAX_NUMERICALFLUX_ELEMS];27 int element_id s[MAX_NUMERICALFLUX_ELEMS];28 int element_offset s[MAX_NUMERICALFLUX_ELEMS];26 Element* element; 27 int element_id; 28 int element_offset; 29 29 30 30 /*nodes: */ … … 36 36 37 37 Numericalflux(); 38 Numericalflux(int numericalflux_id,char numericalflux_type[NUMERICALFLUXSTRING], int numericalflux_node_ids[MAX_NUMERICALFLUX_NODES],int numericalflux_element_id s[MAX_NUMERICALFLUX_ELEMS]);38 Numericalflux(int numericalflux_id,char numericalflux_type[NUMERICALFLUXSTRING], int numericalflux_node_ids[MAX_NUMERICALFLUX_NODES],int numericalflux_element_id); 39 39 Object* copy(); 40 40 ~Numericalflux(); -
issm/trunk/src/c/parallel/prognostic2.cpp
r3373 r3378 61 61 MPI_Comm_size(MPI_COMM_WORLD,&num_procs); 62 62 63 _printf_("recover ,input file name and output file name:\n");63 _printf_("recover input file name and output file name:\n"); 64 64 inputfilename=argv[2]; 65 65 outputfilename=argv[3]; -
issm/trunk/src/c/parallel/prognostic2_core.cpp
r3373 r3378 28 28 int numberofdofspernode; 29 29 int numberofnodes; 30 int dofs[1]={ 0};30 int dofs[1]={1}; 31 31 32 32 /*fem prognostic model: */ 33 33 FemModel* fem_p=NULL; 34 35 34 36 35 /*recover fem model: */ -
issm/trunk/src/m/classes/public/mesh/meshconvert.m
r3354 r3378 31 31 md.y=bamgmesh_out.Vertices(:,2); 32 32 md.elements=bamgmesh_out.Triangles(:,1:3); 33 md.edges=bamgmesh_out.ElementEdges; 33 34 md.segments=bamgmesh_out.Segments(:,1:3); 34 35 md.segmentmarkers=bamgmesh_out.Segments(:,4); -
issm/trunk/src/m/solutions/jpl/prognostic2_core.m
r3372 r3378 23 23 24 24 displaystring(m.parameters.verbose,'\n%s',['extrude computed thickness on all layers:']); 25 results.h_g=FieldAverageOntoVertices(m.elements,m.nodes,m.loads,m.materials,m.parameters,results.h_g,'thickness');25 %results.h_g=FieldAverageOntoVertices(m.elements,m.nodes,m.loads,m.materials,m.parameters,results.h_g,'thickness'); 26 26 27 27 end %end function
Note:
See TracChangeset
for help on using the changeset viewer.