Changeset 16539 for issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
- Timestamp:
- 10/24/13 10:12:44 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r16534 r16539 6 6 7 7 /*Model processing*/ 8 int MasstransportAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/8 int MasstransportAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/ 9 9 return 1; 10 10 }/*}}}*/ 11 void MasstransportAnalysis::UpdateParameters(Parameters** pparameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/ 12 13 /*Get parameters: */ 14 Parameters *parameters=*pparameters; 15 16 parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum)); 17 18 /*Assign output pointer: */ 19 *pparameters = parameters; 20 }/*}}}*/ 21 void MasstransportAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/ 22 23 int stabilization,finiteelement; 24 bool dakota_analysis; 25 bool issmbgradients; 26 bool ispdd; 27 bool isdelta18o; 28 bool isgroundingline; 29 30 /*Fetch data needed: */ 31 iomodel->Constant(&stabilization,MasstransportStabilizationEnum); 32 iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum); 33 iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum); 34 iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum); 35 iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum); 36 iomodel->Constant(&isgroundingline,TransientIsgroundinglineEnum); 37 38 /*Finite element type*/ 39 finiteelement = P1Enum; 40 if(stabilization==3){ 41 finiteelement = P1DGEnum; 42 } 43 44 /*Update elements: */ 45 int counter=0; 46 for(int i=0;i<iomodel->numberofelements;i++){ 47 if(iomodel->my_elements[i]){ 48 Element* element=(Element*)elements->GetObjectByOffset(counter); 49 element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement); 50 counter++; 51 } 52 } 53 54 iomodel->FetchDataToInput(elements,ThicknessEnum); 55 iomodel->FetchDataToInput(elements,SurfaceEnum); 56 iomodel->FetchDataToInput(elements,BedEnum); 57 iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum); 58 iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum); 59 iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum); 60 iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateCorrectionEnum,0.); 61 iomodel->FetchDataToInput(elements,VxEnum); 62 iomodel->FetchDataToInput(elements,VyEnum); 63 64 if(stabilization==3){ 65 iomodel->FetchDataToInput(elements,MasstransportSpcthicknessEnum); //for DG, we need the spc in the element 66 } 67 68 if(dakota_analysis){ 69 elements->InputDuplicate(BedEnum,QmuBedEnum); 70 elements->InputDuplicate(ThicknessEnum,QmuThicknessEnum); 71 elements->InputDuplicate(SurfaceEnum,QmuSurfaceEnum); 72 elements->InputDuplicate(MaskIceLevelsetEnum,QmuMaskIceLevelsetEnum); 73 if(isgroundingline) elements->InputDuplicate(MaskGroundediceLevelsetEnum,QmuMaskGroundediceLevelsetEnum); 74 } 75 76 if(iomodel->meshtype==Mesh3DEnum){ 77 iomodel->FetchDataToInput(elements,MeshElementonbedEnum); 78 iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum); 79 } 80 81 if(issmbgradients){ 82 iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum); 83 iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum); 84 iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum); 85 iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum); 86 } 87 if(ispdd){ 88 iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum); 89 if(isdelta18o){ 90 iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum); 91 iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum); 92 iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum); 93 } 94 else{ 95 iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum); 96 iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum); 97 } 98 } 99 if(~ispdd && ~issmbgradients){ 100 iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.); 101 } 102 }/*}}}*/ 103 void MasstransportAnalysis::CreateNodes(Nodes** pnodes,IoModel* iomodel){/*{{{*/ 104 105 /*Fetch parameters: */ 106 int stabilization; 107 iomodel->Constant(&stabilization,MasstransportStabilizationEnum); 108 109 /*Check in 3d*/ 110 if(stabilization==3 && iomodel->meshtype==Mesh3DEnum) _error_("DG 3d not implemented yet"); 111 112 /*Create Nodes either DG or CG depending on stabilization*/ 113 if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 114 if(stabilization!=3){ 115 ::CreateNodes(pnodes,iomodel,MasstransportAnalysisEnum,P1Enum); 116 } 117 else{ 118 ::CreateNodes(pnodes,iomodel,MasstransportAnalysisEnum,P1DGEnum); 119 } 120 iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 121 }/*}}}*/ 122 void MasstransportAnalysis::CreateConstraints(Constraints** pconstraints,IoModel* iomodel){/*{{{*/ 123 124 /*Fetch parameters: */ 125 int stabilization; 126 iomodel->Constant(&stabilization,MasstransportStabilizationEnum); 127 128 /*Recover pointer: */ 129 Constraints* constraints=*pconstraints; 130 131 /*Do not add constraints in DG, they are weakly imposed*/ 132 if(stabilization!=3){ 133 IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum); 134 } 135 136 /*Assign output pointer: */ 137 *pconstraints=constraints; 138 }/*}}}*/ 139 void MasstransportAnalysis::CreateLoads(Loads** ploads, IoModel* iomodel){/*{{{*/ 140 141 /*Intermediaries*/ 142 int element; 143 int penpair_ids[2]; 144 int count=0; 145 int stabilization; 146 int numvertex_pairing; 147 148 /*Fetch parameters: */ 149 iomodel->Constant(&stabilization,MasstransportStabilizationEnum); 150 151 /*Recover pointer: */ 152 Loads* loads=*ploads; 153 154 /*Loads only in DG*/ 155 if (stabilization==3){ 156 157 /*Get faces and elements*/ 158 CreateFaces(iomodel); 159 iomodel->FetchData(1,ThicknessEnum); 160 161 /*First load data:*/ 162 for(int i=0;i<iomodel->numberoffaces;i++){ 163 164 /*Get left and right elements*/ 165 element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2] 166 167 /*Now, if this element is not in the partition, pass: */ 168 if(!iomodel->my_elements[element]) continue; 169 170 /* Add load */ 171 loads->AddObject(new Numericalflux(iomodel->loadcounter+i+1,i,i,iomodel,MasstransportAnalysisEnum)); 172 } 173 174 /*Free data: */ 175 iomodel->DeleteData(1,ThicknessEnum); 176 } 177 178 /*Create Penpair for vertex_pairing: */ 179 IssmDouble *vertex_pairing=NULL; 180 IssmDouble *nodeonbed=NULL; 181 iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum); 182 iomodel->FetchData(&nodeonbed,NULL,NULL,MeshVertexonbedEnum); 183 184 for(int i=0;i<numvertex_pairing;i++){ 185 186 if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){ 187 188 /*In debugging mode, check that the second node is in the same cpu*/ 189 _assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]); 190 191 /*Skip if one of the two is not on the bed*/ 192 if(!(reCast<bool>(nodeonbed[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonbed[reCast<int>(vertex_pairing[2*i+1])-1]))) continue; 193 194 /*Get node ids*/ 195 penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]); 196 penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]); 197 198 /*Create Load*/ 199 loads->AddObject(new Penpair( 200 iomodel->loadcounter+count+1, 201 &penpair_ids[0], 202 MasstransportAnalysisEnum)); 203 count++; 204 } 205 } 206 207 /*free ressources: */ 208 iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum); 209 iomodel->DeleteData(nodeonbed,MeshVertexonbedEnum); 210 211 /*Assign output pointer: */ 212 *ploads=loads; 213 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.