Changeset 27258


Ignore:
Timestamp:
09/01/22 13:42:11 (3 years ago)
Author:
Eric.Larour
Message:

CHG: better approach, ensure P0Enum.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/branches/trunk-larour-SLPS2022/src/c/analyses/OceantransportAnalysis.cpp

    r27073 r27258  
    44#include "../classes/classes.h"
    55#include "../classes/Inputs/TransientInput.h"
     6#include "../classes/Inputs/TriaInput.h"
     7#include "../classes/gauss/Gauss.h"
    68#include "../shared/shared.h"
    79#include "../modules/modules.h"
     
    101103void           OceantransportAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    102104
    103         /*retrieve bottom pressure, dsl and str from the spcs in our element:*/
     105        /*do nothing:*/
     106        return;
    104107
    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);
    138108}/*}}}*/
    139109void           OceantransportAnalysis::GradientJ(Vector<IssmDouble>* gradient,Element*  element,int control_type,int control_interp,int control_index){/*{{{*/
     
    142112void           OceantransportAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    143113
    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);
    146122
    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);
    150126
    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;
    158135
    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: */
    180137        element->AddInput(BottomPressureEnum,bp,P1Enum);
    181138        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);
    190140
    191141}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.