Changeset 27258
- Timestamp:
- 09/01/22 13:42:11 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/branches/trunk-larour-SLPS2022/src/c/analyses/OceantransportAnalysis.cpp
r27073 r27258 4 4 #include "../classes/classes.h" 5 5 #include "../classes/Inputs/TransientInput.h" 6 #include "../classes/Inputs/TriaInput.h" 7 #include "../classes/gauss/Gauss.h" 6 8 #include "../shared/shared.h" 7 9 #include "../modules/modules.h" … … 101 103 void OceantransportAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 102 104 103 /*retrieve bottom pressure, dsl and str from the spcs in our element:*/ 105 /*do nothing:*/ 106 return; 104 107 105 IssmDouble bp,dsl,str;106 int *doflist = NULL;107 108 /*Fetch number of nodes and initialize values*/109 int numnodes = element->GetNumberOfNodes();110 int numdof = numnodes*3;111 IssmDouble* values = xNew<IssmDouble>(numdof);112 113 /*Get dof list and inputs */114 element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);115 Input* bp_input=element->GetInput(OceantransportSpcbottompressureEnum); _assert_(bp_input);116 Input* dsl_input=element->GetInput(OceantransportSpcdslEnum); _assert_(dsl_input);117 Input* str_input=element->GetInput(OceantransportSpcstrEnum); _assert_(str_input);118 119 /*Ok, we have the velocities in inputs, fill in solution */120 Gauss* gauss=element->NewGauss();121 for(int i=0;i<numnodes;i++){122 gauss->GaussVertex(i);123 bp_input->GetInputValue(&bp,gauss);124 dsl_input->GetInputValue(&dsl,gauss);125 str_input->GetInputValue(&str,gauss);126 values[i*3+0]=bp;127 values[i*3+1]=dsl;128 values[i*3+2]=str;129 }130 131 /*Add value to global vector*/132 solution->SetValues(numdof,doflist,values,INS_VAL);133 134 /*Free ressources:*/135 delete gauss;136 xDelete<int>(doflist);137 xDelete<IssmDouble>(values);138 108 }/*}}}*/ 139 109 void OceantransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_interp,int control_index){/*{{{*/ … … 142 112 void OceantransportAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 143 113 144 int i,domaintype; 145 int* doflist=NULL; 114 /*Fetch number of nodes and dof for this finite element*/ 115 IssmDouble time; 116 IssmDouble bp[3]; 117 IssmDouble dsl[3]; 118 IssmDouble str; 119 int numnodes = element->GetNumberOfNodes(); 120 121 element->parameters->FindParam(&time,TimeEnum); 146 122 147 /*Fetch number of nodes and dof for this finite element*/148 int numnodes = element->GetNumberOfNodes();149 int numdof = numnodes*3;123 TriaInput* str_input=xDynamicCast<TriaInput*>(element->GetInput(OceantransportSpcstrEnum,time)); _assert_(str_input); 124 TriaInput* bp_input=xDynamicCast<TriaInput*>(element->GetInput(OceantransportSpcbottompressureEnum,time)); _assert_(bp_input); 125 TriaInput* dsl_input=xDynamicCast<TriaInput*>(element->GetInput(OceantransportSpcdslEnum,time)); _assert_(dsl_input); 150 126 151 /*Fetch dof list and allocate solution vectors*/ 152 element->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum); 153 IssmDouble* values = xNew<IssmDouble>(numdof); 154 IssmDouble* bp = xNew<IssmDouble>(numnodes); 155 IssmDouble* dsl = xNew<IssmDouble>(numnodes); 156 IssmDouble* str = xNew<IssmDouble>(numnodes); 157 IssmDouble strmean; 127 Gauss* gauss=element->NewGauss(); 128 for(int iv=0;iv<3;iv++){ 129 gauss->GaussVertex(iv); 130 bp_input->GetInputValue(&bp[iv],gauss); 131 dsl_input->GetInputValue(&dsl[iv],gauss); 132 } 133 str_input->GetInputAverage(&str); 134 delete gauss; 158 135 159 /*Use the dof list to index into the solution vector: */ 160 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]]; 161 162 /*Retrieve bp,dsl and str:*/ 163 strmean=0; 164 for(i=0;i<numnodes;i++){ 165 bp[i]=values[i*3+0]; 166 dsl[i]=values[i*3+1]; 167 str[i]=values[i*3+2]; 168 strmean+=str[i]/numnodes; 169 170 /*Check solution*/ 171 if(xIsNan<IssmDouble>(bp[i])) _error_("NaN found in bottom pressure solution vector"); 172 if(xIsInf<IssmDouble>(bp[i])) _error_("Inf found in bottom pressure solution vector"); 173 if(xIsNan<IssmDouble>(dsl[i])) _error_("NaN found in dsl solution vector"); 174 if(xIsInf<IssmDouble>(dsl[i])) _error_("Inf found in dsl solution vector"); 175 if(xIsNan<IssmDouble>(str[i])) _error_("NaN found in str solution vector"); 176 if(xIsInf<IssmDouble>(str[i])) _error_("Inf found in str solution vector"); 177 } 178 179 /*Add bp, dsl and str as inputs to the tria element: */ 136 /*Add str bp and dsl levelsets as inputs to the tria element: */ 180 137 element->AddInput(BottomPressureEnum,bp,P1Enum); 181 138 element->AddInput(DslEnum,dsl,P1Enum); 182 element->AddInput(StrEnum,&strmean,P0Enum); 183 184 /*Free ressources:*/ 185 xDelete<IssmDouble>(bp); 186 xDelete<IssmDouble>(str); 187 xDelete<IssmDouble>(dsl); 188 xDelete<IssmDouble>(values); 189 xDelete<int>(doflist); 139 element->AddInput(StrEnum,&str,P0Enum); 190 140 191 141 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.