Changeset 23629
- Timestamp:
- 01/13/19 20:48:33 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 26 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r23585 r23629 2335 2335 2336 2336 /*Get dof list: */ 2337 element->GetDofList Velocity(&vdoflist,GsetEnum);2338 element->GetDofList Pressure(&pdoflist,GsetEnum);2337 element->GetDofListLocalVelocity(&vdoflist,GsetEnum); 2338 element->GetDofListLocalPressure(&pdoflist,GsetEnum); 2339 2339 2340 2340 /*Use the dof list to index into the solution vector: */ … … 2401 2401 else numdof = numnodes*1; 2402 2402 /*Fetch dof list and allocate solution vectors*/ 2403 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);2403 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 2404 2404 IssmDouble* values = xNew<IssmDouble>(numdof); 2405 2405 IssmDouble* lambdax = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r23587 r23629 634 634 635 635 /*Fetch dof list and allocate solution vector*/ 636 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);636 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 637 637 IssmDouble* newdamage = xNew<IssmDouble>(numnodes); 638 638 -
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
r23620 r23629 1528 1528 1529 1529 /*Fetch dof list and allocate solution vector*/ 1530 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);1530 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 1531 1531 IssmDouble* values = xNew<IssmDouble>(numnodes); 1532 1532 IssmDouble* pressure = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r23585 r23629 435 435 IssmDouble* eplHeads = xNew<IssmDouble>(numnodes); 436 436 IssmDouble* basevalue = xNew<IssmDouble>(numnodes); 437 basalelement->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);437 basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 438 438 439 439 Input* active_element_input=basalelement->GetInput(HydrologydcMaskEplactiveEltEnum); _assert_(active_element_input); -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
r23585 r23629 511 511 512 512 /*Fetch dof list and allocate solution vector*/ 513 basalelement->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);513 basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 514 514 IssmDouble* values = xNew<IssmDouble>(numnodes); 515 515 IssmDouble* pressure = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.cpp
r23585 r23629 361 361 362 362 /*Fetch dof list and allocate solution vector*/ 363 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);363 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 364 364 IssmDouble* values = xNew<IssmDouble>(numnodes); 365 365 -
issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
r23585 r23629 356 356 357 357 /*Fetch dof list and allocate solution vector*/ 358 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);358 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 359 359 IssmDouble* values = xNew<IssmDouble>(numnodes); 360 360 -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r23587 r23629 708 708 709 709 /*Fetch dof list and allocate solution vector*/ 710 basalelement->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);710 basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 711 711 IssmDouble* newthickness = xNew<IssmDouble>(numnodes); 712 712 IssmDouble* cumdeltathickness = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r23585 r23629 1915 1915 1916 1916 /*Fetch dof list and allocate solution vectors*/ 1917 basalelement->GetDofList (&doflist,SSAApproximationEnum,GsetEnum);1917 basalelement->GetDofListLocal(&doflist,SSAApproximationEnum,GsetEnum); 1918 1918 IssmDouble* values = xNew<IssmDouble>(numdof); 1919 1919 IssmDouble* vx = xNew<IssmDouble>(numnodes); … … 2244 2244 2245 2245 /*Fetch dof list and allocate solution vectors*/ 2246 basalelement->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);2246 basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 2247 2247 IssmDouble* values = xNew<IssmDouble>(numdof); 2248 2248 IssmDouble* vx = xNew<IssmDouble>(numnodes); … … 2899 2899 2900 2900 /*Fetch dof list and allocate solution vectors*/ 2901 element->GetDofList (&doflist,HOApproximationEnum,GsetEnum);2901 element->GetDofListLocal(&doflist,HOApproximationEnum,GsetEnum); 2902 2902 IssmDouble* values = xNew<IssmDouble>(numdof); 2903 2903 IssmDouble* vx = xNew<IssmDouble>(numnodes); … … 5182 5182 5183 5183 /*Get dof list: */ 5184 element->GetDofList Velocity(&vdoflist,GsetEnum);5185 element->GetDofList Pressure(&pdoflist,GsetEnum);5184 element->GetDofListLocalVelocity(&vdoflist,GsetEnum); 5185 element->GetDofListLocalPressure(&pdoflist,GsetEnum); 5186 5186 5187 5187 /*Use the dof list to index into the solution vector: */ … … 7081 7081 7082 7082 /*Fetch dof list and allocate solution vectors*/ 7083 element->GetDofList (&doflistFSv,FSvelocityEnum,GsetEnum);7084 element->GetDofList (&doflistHO, HOApproximationEnum, GsetEnum);7085 element->GetDofList Pressure(&doflistFSp,GsetEnum);7083 element->GetDofListLocal(&doflistFSv,FSvelocityEnum,GsetEnum); 7084 element->GetDofListLocal(&doflistHO, HOApproximationEnum, GsetEnum); 7085 element->GetDofListLocalPressure(&doflistFSp,GsetEnum); 7086 7086 IssmDouble* HOvalues = xNew<IssmDouble>(numdofHO); 7087 7087 IssmDouble* FSvalues = xNew<IssmDouble>(numdofFSv+numdofFSp); … … 7180 7180 7181 7181 /*Fetch dof list and allocate solution vectors*/ 7182 element->GetDofList (&doflistFSv,FSvelocityEnum,GsetEnum);7183 element->GetDofList Pressure(&doflistFSp,GsetEnum);7184 basalelement->GetDofList (&doflistSSA, SSAApproximationEnum, GsetEnum);7182 element->GetDofListLocal(&doflistFSv,FSvelocityEnum,GsetEnum); 7183 element->GetDofListLocalPressure(&doflistFSp,GsetEnum); 7184 basalelement->GetDofListLocal(&doflistSSA, SSAApproximationEnum, GsetEnum); 7185 7185 IssmDouble* SSAvalues = xNew<IssmDouble>(numdofSSA); 7186 7186 IssmDouble* FSvalues = xNew<IssmDouble>(numdofFSv+numdofFSp); … … 7281 7281 7282 7282 /*Fetch dof list and allocate solution vectors*/ 7283 basalelement->GetDofList (&SSAdoflist,SSAApproximationEnum,GsetEnum);7284 element ->GetDofList (&HOdoflist, HOApproximationEnum, GsetEnum);7283 basalelement->GetDofListLocal(&SSAdoflist,SSAApproximationEnum,GsetEnum); 7284 element ->GetDofListLocal(&HOdoflist, HOApproximationEnum, GsetEnum); 7285 7285 IssmDouble* HOvalues = xNew<IssmDouble>(numdof); 7286 7286 IssmDouble* SSAvalues = xNew<IssmDouble>(numdof); -
issm/trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
r23585 r23629 564 564 565 565 /*Fetch dof list and allocate solution vectors*/ 566 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);566 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 567 567 IssmDouble* values = xNew<IssmDouble>(numdof); 568 568 IssmDouble* vx = xNew<IssmDouble>(numdof); -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
r23585 r23629 526 526 /*Get dof list and vertices coordinates: */ 527 527 element->GetVerticesCoordinates(&xyz_list); 528 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);528 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 529 529 IssmDouble* values = xNew<IssmDouble>(numdof); 530 530 IssmDouble* vx = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
r23585 r23629 814 814 815 815 /*Fetch dof list and allocate solution vector*/ 816 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);816 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 817 817 IssmDouble* values = xNew<IssmDouble>(numnodes); 818 818 IssmDouble* surface = xNew<IssmDouble>(numnodes); -
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
r23585 r23629 205 205 206 206 /*Fetch dof list and allocate solution vector*/ 207 element->GetDofList (&doflist,NoneApproximationEnum,GsetEnum);207 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 208 208 IssmDouble* values = xNew<IssmDouble>(numnodes); 209 209 IssmDouble* valueslambda = xNewZeroInit<IssmDouble>(numnodessigma); -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r23612 r23629 1004 1004 } 1005 1005 /*}}}*/ 1006 void Element::GetDofListLocal(int** pdoflist,int approximation_enum,int setenum){/*{{{*/ 1007 1008 /*Fetch number of nodes and dof for this finite element*/ 1009 int numnodes = this->GetNumberOfNodes(); 1010 1011 /*First, figure out size of doflist and create it: */ 1012 int numberofdofs=0; 1013 for(int i=0;i<numnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(approximation_enum,setenum); 1014 1015 /*Allocate output*/ 1016 int* doflist=xNew<int>(numberofdofs); 1017 1018 /*Populate: */ 1019 int count=0; 1020 for(int i=0;i<numnodes;i++){ 1021 nodes[i]->GetDofListLocal(doflist+count,approximation_enum,setenum); 1022 count+=nodes[i]->GetNumberOfDofs(approximation_enum,setenum); 1023 } 1024 1025 /*Assign output pointers:*/ 1026 *pdoflist=doflist; 1027 } 1028 /*}}}*/ 1006 1029 void Element::GetDofListPressure(int** pdoflist,int setenum){/*{{{*/ 1007 1030 … … 1044 1067 for(int i=0;i<numnodes;i++){ 1045 1068 nodes[i]->GetDofList(doflist+count,FSvelocityEnum,setenum); 1069 count+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum); 1070 } 1071 1072 /*Assign output pointers:*/ 1073 *pdoflist=doflist; 1074 } 1075 /*}}}*/ 1076 void Element::GetDofListLocalPressure(int** pdoflist,int setenum){/*{{{*/ 1077 1078 /*Fetch number of nodes and dof for this finite element*/ 1079 int vnumnodes = this->NumberofNodesVelocity(); 1080 int pnumnodes = this->NumberofNodesPressure(); 1081 1082 /*First, figure out size of doflist and create it: */ 1083 int numberofdofs=0; 1084 for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum); 1085 1086 /*Allocate output*/ 1087 int* doflist=xNew<int>(numberofdofs); 1088 1089 /*Populate: */ 1090 int count=0; 1091 for(int i=vnumnodes;i<vnumnodes+pnumnodes;i++){ 1092 nodes[i]->GetDofListLocal(doflist+count,FSApproximationEnum,setenum); 1093 count+=nodes[i]->GetNumberOfDofs(FSApproximationEnum,setenum); 1094 } 1095 1096 /*Assign output pointers:*/ 1097 *pdoflist=doflist; 1098 } 1099 /*}}}*/ 1100 void Element::GetDofListLocalVelocity(int** pdoflist,int setenum){/*{{{*/ 1101 1102 /*Fetch number of nodes and dof for this finite element*/ 1103 int numnodes = this->NumberofNodesVelocity(); 1104 1105 /*First, figure out size of doflist and create it: */ 1106 int numberofdofs=0; 1107 for(int i=0;i<numnodes;i++) numberofdofs+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum); 1108 1109 /*Allocate output*/ 1110 int* doflist=xNew<int>(numberofdofs); 1111 1112 /*Populate: */ 1113 int count=0; 1114 for(int i=0;i<numnodes;i++){ 1115 nodes[i]->GetDofListLocal(doflist+count,FSvelocityEnum,setenum); 1046 1116 count+=nodes[i]->GetNumberOfDofs(FSvelocityEnum,setenum); 1047 1117 } -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r23540 r23629 86 86 void GetDofListPressure(int** pdoflist,int setenum); 87 87 void GetDofListVelocity(int** pdoflist,int setenum); 88 void GetDofListLocal(int** pdoflist,int approximation_enum,int setenum); 89 void GetDofListLocalPressure(int** pdoflist,int setenum); 90 void GetDofListLocalVelocity(int** pdoflist,int setenum); 88 91 Input* GetInput(int inputenum); 89 92 void GetInputListOnNodes(IssmDouble* pvalue,int enumtype); -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r23599 r23629 1594 1594 1595 1595 /*Fetch dof list and allocate solution vector*/ 1596 GetDofList (&doflist,NoneApproximationEnum,GsetEnum);1596 GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 1597 1597 IssmDouble* values = xNew<IssmDouble>(numnodes); 1598 1598 … … 1625 1625 1626 1626 /*Get dof list: */ 1627 GetDofList (&doflist,NoneApproximationEnum,GsetEnum);1627 GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 1628 1628 1629 1629 /*Use the dof list to index into the solution vector and extrude it */ -
issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp
r23532 r23629 490 490 491 491 /*Fetch dof list and allocate solution vector*/ 492 GetDofList (&doflist,NoneApproximationEnum,GsetEnum);492 GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 493 493 IssmDouble* values = xNew<IssmDouble>(numnodes); 494 494 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r23607 r23629 2170 2170 2171 2171 /*Fetch dof list and allocate solution vector*/ 2172 GetDofList (&doflist,NoneApproximationEnum,GsetEnum);2172 GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 2173 2173 IssmDouble* values = xNew<IssmDouble>(numnodes); 2174 2174 -
issm/trunk-jpl/src/c/classes/Node.cpp
r23628 r23629 452 452 } 453 453 /*}}}*/ 454 void Node::GetDofListLocal(int* outdoflist,int approximation_enum,int setenum){/*{{{*/ 455 int i; 456 int count=0; 457 int count2=0; 458 459 _assert_(!this->indexingupdate); 460 461 if(approximation_enum==NoneApproximationEnum){ 462 if(setenum==GsetEnum)for(i=0;i<this->gsize;i++) outdoflist[i]=gdoflist_local[i]; 463 if(setenum==FsetEnum)for(i=0;i<this->fsize;i++) outdoflist[i]=fdoflist_local[i]; 464 if(setenum==SsetEnum)for(i=0;i<this->ssize;i++) outdoflist[i]=sdoflist_local[i]; 465 } 466 else{ 467 468 if(setenum==GsetEnum){ 469 if(doftype){ 470 count=0; 471 for(i=0;i<this->gsize;i++){ 472 if(doftype[i]==approximation_enum){ 473 outdoflist[count]=gdoflist_local[i]; 474 count++; 475 } 476 } 477 _assert_(count); //at least one dof should be the approximation requested 478 } 479 else for(i=0;i<this->gsize;i++) outdoflist[i]=gdoflist_local[i]; 480 } 481 else if(setenum==FsetEnum){ 482 if(doftype){ 483 count=0; 484 count2=0; 485 for(i=0;i<this->gsize;i++){ 486 if(f_set[i]){ 487 if(doftype[i]==approximation_enum){ 488 outdoflist[count]=fdoflist_local[count2]; 489 count++; 490 } 491 count2++; 492 } 493 } 494 } 495 else for(i=0;i<this->fsize;i++) outdoflist[i]=fdoflist_local[i]; 496 } 497 else if(setenum==SsetEnum){ 498 if(doftype){ 499 count=0; 500 count2=0; 501 for(i=0;i<this->gsize;i++){ 502 if(s_set[i]){ 503 if(doftype[i]==approximation_enum){ 504 outdoflist[count]=sdoflist_local[count2]; 505 count++; 506 } 507 count2++; 508 } 509 } 510 } 511 else for(i=0;i<this->ssize;i++) outdoflist[i]=sdoflist_local[i]; 512 } 513 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); 514 } 515 } 516 /*}}}*/ 454 517 void Node::GetLocalDofList(int* outdoflist,int approximation_enum,int setenum){/*{{{*/ 455 518 int i; -
issm/trunk-jpl/src/c/classes/Node.h
r23628 r23629 89 89 int GetDof(int dofindex,int setenum); 90 90 void GetDofList(int* poutdoflist,int approximation_enum,int setenum); 91 void GetDofListLocal(int* poutdoflist,int approximation_enum,int setenum); 91 92 void GetLocalDofList(int* poutdoflist,int approximation_enum,int setenum); 92 93 int GetNumberOfDofs(int approximation_enum,int setenum); -
issm/trunk-jpl/src/c/classes/Nodes.cpp
r23627 r23629 259 259 } 260 260 /*}}}*/ 261 int Nodes::NumberOfDofsLocalAll(int setenum){/*{{{*/ 262 263 /*go through all nodes, and get how many dofs they own, unless they are clone nodes: */ 264 int numdofs=0; 265 for(int i=0;i<this->Size();i++){ 266 Node* node=xDynamicCast<Node*>(this->GetObjectByOffset(i)); 267 numdofs+=node->GetNumberOfDofs(NoneApproximationEnum,setenum); 268 } 269 return numdofs; 270 } 271 /*}}}*/ 261 272 int Nodes::NumberOfNodes(void){/*{{{*/ 262 273 -
issm/trunk-jpl/src/c/classes/Nodes.h
r23587 r23629 37 37 int NumberOfDofs(int setenum); 38 38 int NumberOfDofsLocal(int setenum); 39 int NumberOfDofsLocalAll(int setenum); 39 40 int NumberOfNodes(void); 40 41 bool RequiresDofReindexing(void); -
issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.cpp
r23473 r23629 9 9 void InputUpdateFromSolutionx(FemModel* femmodel,Vector<IssmDouble>* solution){ 10 10 11 /*Serialize solution, so that elements can index into it on every CPU: */12 femmodel->profiler->Start(MPISERIAL);13 IssmDouble* serial_solution=solution->ToMPISerial();14 femmodel->profiler->Stop(MPISERIAL);15 16 /*Call overloaded form of InputUpdateFromSolutionx: */17 InputUpdateFromSolutionx(femmodel,serial_solution);18 19 /*cleanup and return*/20 xDelete<IssmDouble>(serial_solution);21 }22 23 void InputUpdateFromSolutionx(FemModel* femmodel,IssmDouble* solution){24 25 /*retrive parameters: */26 int analysisenum;27 femmodel->parameters->FindParam(&analysisenum,AnalysisTypeEnum);28 29 11 /*Display message*/ 30 12 if(VerboseModule()) _printf0_(" Updating inputs from solution\n"); 31 13 14 /*GetAnalysis*/ 15 int analysisenum; 16 femmodel->parameters->FindParam(&analysisenum,AnalysisTypeEnum); 32 17 Analysis* analysis = EnumToAnalysis(analysisenum); 18 19 /*recover my_rank:*/ 20 ISSM_MPI_Status status; 21 int my_rank = IssmComm::GetRank(); 22 int num_procs = IssmComm::GetSize(); 23 24 /*retrieve node info*/ 25 int gsize = femmodel->nodes->NumberOfDofs(GsetEnum); 26 int glocalsize_masters = femmodel->nodes->NumberOfDofsLocal(GsetEnum); 27 int glocalsize = femmodel->nodes->NumberOfDofsLocalAll(GsetEnum); 28 int maxdofspernode = femmodel->nodes->MaxNumDofs(GsetEnum); 29 30 /*Get local vector of ug*/ 31 int *indices_ug_masters = NULL; 32 IssmDouble *local_ug_masters = NULL; 33 solution->GetLocalVector(&local_ug_masters,&indices_ug_masters); 34 _assert_(glocalsize_masters==indices_ug_masters[glocalsize_masters-1] - indices_ug_masters[0]+1); 35 xDelete<int>(indices_ug_masters); 36 37 /*Now, extend vectors to account for clones (make vectors longer, for clones at the end)*/ 38 IssmDouble *local_ug = xNew<IssmDouble>(glocalsize); 39 xMemCpy<IssmDouble>(local_ug,local_ug_masters,glocalsize_masters); 40 xDelete<IssmDouble>(local_ug_masters); 41 42 /*Now send and receive ug for nodes on partition edge*/ 43 IssmDouble* buffer = xNew<IssmDouble>(femmodel->nodes->Size()*maxdofspernode); //only one alloc 44 for(int rank=0;rank<num_procs;rank++){ 45 if(femmodel->nodes->common_send[rank]){ 46 int numids = femmodel->nodes->common_send[rank]; 47 for(int i=0;i<numids;i++){ 48 int master_lid = femmodel->nodes->common_send_ids[rank][i]; 49 Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid)); 50 _assert_(!node->IsClone()); 51 for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]]; 52 } 53 ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm()); 54 } 55 } 56 for(int rank=0;rank<num_procs;rank++){ 57 if(femmodel->nodes->common_recv[rank]){ 58 int numids = femmodel->nodes->common_recv[rank]; 59 ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status); 60 for(int i=0;i<numids;i++){ 61 int master_lid = femmodel->nodes->common_recv_ids[rank][i]; 62 Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid)); 63 for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j]; 64 } 65 } 66 } 67 xDelete<IssmDouble>(buffer); 68 69 /*Now update inputs (analysis specific)*/ 33 70 for(int i=0;i<femmodel->elements->Size();i++){ 34 71 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 35 analysis->InputUpdateFromSolution( solution,element);72 analysis->InputUpdateFromSolution(local_ug,element); 36 73 } 74 75 /*cleanup and return*/ 37 76 delete analysis; 77 xDelete<IssmDouble>(local_ug); 38 78 } -
issm/trunk-jpl/src/c/modules/InputUpdateFromSolutionx/InputUpdateFromSolutionx.h
r16695 r23629 11 11 /* local prototypes: */ 12 12 void InputUpdateFromSolutionx(FemModel* femmodel,Vector<IssmDouble>* solution); 13 void InputUpdateFromSolutionx(FemModel* femmodel,IssmDouble* solution);14 13 15 14 #endif /* _UPDATEINPUTSFROMSOLUTIONXX_H */ -
issm/trunk-jpl/src/c/modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp
r23628 r23629 13 13 /*first, get gsize, fsize and ssize: */ 14 14 int gsize=nodes->NumberOfDofs(GsetEnum); 15 int gsize_local=nodes->NumberOfDofsLocal(GsetEnum); 15 16 int fsize=nodes->NumberOfDofs(FsetEnum); 16 17 int ssize=nodes->NumberOfDofs(SsetEnum); … … 29 30 30 31 /*initialize ug: */ 31 Vector<IssmDouble>* ug=new Vector<IssmDouble>(gsize );32 Vector<IssmDouble>* ug=new Vector<IssmDouble>(gsize_local,gsize); 32 33 33 34 /*Let nodes figure it out*/ -
issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
r23587 r23629 85 85 86 86 /*Create vector on gset*/ 87 int gsize=femmodel->nodes->NumberOfDofs(GsetEnum); 87 int gsize = femmodel->nodes->NumberOfDofs(GsetEnum); 88 int glocalsize_masters = femmodel->nodes->NumberOfDofsLocal(GsetEnum); 88 89 if(gsize==0) return; 89 Vector<IssmDouble>* vec_mask_ice=new Vector<IssmDouble>(g size);90 Vector<IssmDouble>* vec_mask_ice=new Vector<IssmDouble>(glocalsize_masters,gsize); 90 91 91 92 /*Fill vector with values: */ … … 107 108 /*Assemble vector and serialize */ 108 109 vec_mask_ice->Assemble(); 109 IssmDouble* mask_ice=vec_mask_ice->ToMPISerial(); 110 111 112 /*FIXME: What follows should be copied and pasted into InputUpdateFromSolution Nodes*/ 113 114 /*recover my_rank:*/ 115 ISSM_MPI_Status status; 116 int my_rank = IssmComm::GetRank(); 117 int num_procs = IssmComm::GetSize(); 118 119 /*retrieve node info*/ 120 int glocalsize = femmodel->nodes->NumberOfDofsLocalAll(GsetEnum); 121 int maxdofspernode = femmodel->nodes->MaxNumDofs(GsetEnum); 122 123 /*Get local vector of ug*/ 124 int *indices_ug_masters = NULL; 125 IssmDouble *local_ug_masters = NULL; 126 vec_mask_ice->GetLocalVector(&local_ug_masters,&indices_ug_masters); 127 _assert_(glocalsize_masters==indices_ug_masters[glocalsize_masters-1] - indices_ug_masters[0]+1); 128 xDelete<int>(indices_ug_masters); 110 129 delete vec_mask_ice; 130 131 /*Now, extend vectors to account for clones (make vectors longer, for clones at the end)*/ 132 IssmDouble *local_ug = xNew<IssmDouble>(glocalsize); 133 xMemCpy<IssmDouble>(local_ug,local_ug_masters,glocalsize_masters); 134 xDelete<IssmDouble>(local_ug_masters); 135 136 /*Now send and receive ug for nodes on partition edge*/ 137 IssmDouble* buffer = xNew<IssmDouble>(femmodel->nodes->Size()*maxdofspernode); //only one alloc 138 for(int rank=0;rank<num_procs;rank++){ 139 if(femmodel->nodes->common_send[rank]){ 140 int numids = femmodel->nodes->common_send[rank]; 141 for(int i=0;i<numids;i++){ 142 int master_lid = femmodel->nodes->common_send_ids[rank][i]; 143 Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid)); 144 _assert_(!node->IsClone()); 145 for(int j=0;j<node->gsize;j++) buffer[i*maxdofspernode+j]=local_ug[node->gdoflist_local[j]]; 146 } 147 ISSM_MPI_Send(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm()); 148 } 149 } 150 for(int rank=0;rank<num_procs;rank++){ 151 if(femmodel->nodes->common_recv[rank]){ 152 int numids = femmodel->nodes->common_recv[rank]; 153 ISSM_MPI_Recv(buffer,numids*maxdofspernode,ISSM_MPI_DOUBLE,rank,0,IssmComm::GetComm(),&status); 154 for(int i=0;i<numids;i++){ 155 int master_lid = femmodel->nodes->common_recv_ids[rank][i]; 156 Node* node=xDynamicCast<Node*>(femmodel->nodes->GetObjectByOffset(master_lid)); 157 for(int j=0;j<node->gsize;j++) local_ug[node->gdoflist_local[j]] = buffer[i*maxdofspernode+j]; 158 } 159 } 160 } 161 xDelete<IssmDouble>(buffer); 162 163 /*Now update inputs (analysis specific)*/ 111 164 for(int i=0;i<femmodel->elements->Size();i++){ 112 165 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 113 element->InputUpdateFromSolutionOneDof( mask_ice,IceMaskNodeActivationEnum);166 element->InputUpdateFromSolutionOneDof(local_ug,IceMaskNodeActivationEnum); 114 167 } 115 168 116 /* Cleanup and return*/117 xDelete<IssmDouble>( mask_ice);169 /*cleanup and return*/ 170 xDelete<IssmDouble>(local_ug); 118 171 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.