Changeset 27721


Ignore:
Timestamp:
05/03/23 13:41:37 (23 months ago)
Author:
Mathieu Morlighem
Message:

CHG: done with transient cost function

Location:
issm/trunk-jpl/src/c/classes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Cfsurfacesquaretransient.cpp

    r27709 r27721  
    3232        this->datatimes      = NULL;
    3333        this->passedflags    = NULL;
    34 }
    35 /*}}}*/
    36 Cfsurfacesquaretransient::Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum, int in_num_datatimes, IssmDouble* in_datatimes, bool* in_passedflags){/*{{{*/
     34        this->J              = 0.;
     35}
     36/*}}}*/
     37Cfsurfacesquaretransient::Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum, int in_num_datatimes, IssmDouble* in_datatimes, bool* in_passedflags, IssmDouble in_J){/*{{{*/
    3738
    3839        this->definitionenum=in_definitionenum;
     
    5051        xMemCpy<IssmDouble>(this->datatimes,in_datatimes,this->num_datatimes);
    5152        xMemCpy<bool>(this->passedflags,in_passedflags,this->num_datatimes);
     53
     54        this->J = in_J;
    5255}
    5356/*}}}*/
     
    7073        /*initialize passedtimes to false*/
    7174        for(int i=0;i<this->num_datatimes;i++) this->passedflags[i]= false;
     75        this->J = 0;
    7276}
    7377/*}}}*/
     
    8185/*Object virtual function resolutoin: */
    8286Object* Cfsurfacesquaretransient::copy() {/*{{{*/
    83         Cfsurfacesquaretransient* output = new Cfsurfacesquaretransient(this->name,this->definitionenum, this->model_enum, this->num_datatimes, this->datatimes,this->passedflags);
     87        Cfsurfacesquaretransient* output = new Cfsurfacesquaretransient(this->name,this->definitionenum, this->model_enum, this->num_datatimes, this->datatimes,this->passedflags, this->J);
    8488        return (Object*)output;
    8589}
     
    110114        marshallhandle->call(this->datatimes,this->num_datatimes);
    111115        marshallhandle->call(this->passedflags,this->num_datatimes);
     116        marshallhandle->call(this->J);
    112117}
    113118/*}}}*/
     
    130135/*}}}*/
    131136IssmDouble Cfsurfacesquaretransient::Response(FemModel* femmodel){/*{{{*/
    132          _error_("Not implemented yet");
    133 
    134 }
    135 /*}}}*/
     137
     138        /*recover model time parameters: */
     139        IssmDouble time;
     140        femmodel->parameters->FindParam(&time,TimeEnum);
     141
     142        /*Find closest datatime that is less than time*/
     143        int pos=-1;
     144        for(int i=0;i<this->num_datatimes;i++){
     145                if(this->datatimes[i]<=time){
     146                        pos = i;
     147                }
     148                else{
     149                        break;
     150                }
     151        }
     152
     153        /*if pos=-1, time is earlier than the first data observation in this dataset*/
     154        if(pos==-1){
     155                _assert_(this->J==0.);
     156                return 0.;
     157        }
     158
     159        /*Check that we have not yet calculated this cost function*/
     160        if(this->passedflags[pos]){
     161                return 0.;
     162                //return this->J; //FIXME
     163        }
     164
     165        /*Calculate cost function for this time slice*/
     166        IssmDouble J_part=0.;
     167        for(Object* & object : femmodel->elements->objects){
     168                Element* element=xDynamicCast<Element*>(object);
     169                J_part+=this->Cfsurfacesquaretransient_Calculation(element,model_enum);
     170        }
     171
     172        /*Sum across partition*/
     173        IssmDouble J_sum;
     174        ISSM_MPI_Allreduce( (void*)&J_part,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
     175        ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     176
     177        /*Record this cost function so that we do not recalculate it later*/
     178        this->passedflags[pos]= true;
     179        this->J += J_sum;
     180
     181        /*Return full cost function this far*/
     182        //return this->J; //FIXME
     183        return J_sum;
     184}/*}}}*/
    136185IssmDouble Cfsurfacesquaretransient::Cfsurfacesquaretransient_Calculation(Element* element, int model_enum){/*{{{*/
    137186
    138         _error_("not implemented");
     187        IssmDouble Jelem=0.;
     188        IssmDouble misfit,Jdet;
     189        IssmDouble model,obs,weight;
     190        IssmDouble* xyz_list = NULL;
     191
     192        /*Get basal element*/
     193        if(!element->IsOnSurface()) return 0.;
     194
     195        /*If on water, return 0: */
     196        if(!element->IsIceInElement()) return 0.;
     197
     198        /*Spawn surface element*/
     199        Element* topelement = element->SpawnTopElement();
     200
     201        /* Get node coordinates*/
     202        topelement->GetVerticesCoordinates(&xyz_list);
     203
     204        /*Retrieve all inputs we will be needing: */
     205        DatasetInput *datasetinput = topelement->GetDatasetInput(definitionenum); _assert_(datasetinput);
     206        Input        *model_input  = topelement->GetInput(model_enum);            _assert_(model_input);
     207
     208        /* Start  looping on the number of gaussian points: */
     209        Gauss* gauss=topelement->NewGauss(2);
     210        while(gauss->next()){
     211
     212                /* Get Jacobian determinant: */
     213                topelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     214
     215                /*Get all parameters at gaussian point*/
     216                datasetinput->GetInputValue(&weight,gauss,WeightsSurfaceObservationEnum);
     217                datasetinput->GetInputValue(&obs,gauss,SurfaceObservationEnum);
     218                model_input->GetInputValue(&model,gauss);
     219
     220                /*Compute Misfit
     221                 *     
     222                 *       1  [           2 ]
     223                 *  J = --- | (x - x   )  |
     224                 *       2  [       obs   ]
     225                 **/
     226                misfit=0.5*(model-obs)*(model-obs);
     227
     228                /*Add to cost function*/
     229                Jelem+=misfit*weight*Jdet*gauss->weight;
     230        }
     231
     232        /*clean up and Return: */
     233        if(topelement->IsSpawnedElement()){topelement->DeleteMaterials(); delete topelement;};
     234        xDelete<IssmDouble>(xyz_list);
     235        delete gauss;
     236        return Jelem;
    139237}/*}}}*/
  • issm/trunk-jpl/src/c/classes/Cfsurfacesquaretransient.h

    r27709 r27721  
    2222                IssmDouble *datatimes;
    2323                bool       *passedflags;
     24                IssmDouble  J;
    2425
    2526                /*Cfsurfacesquaretransient constructors, destructors :*/
    2627                Cfsurfacesquaretransient();
    2728                Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime);
    28                 Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag);
     29                Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag, IssmDouble in_J);
    2930                ~Cfsurfacesquaretransient();
    3031
Note: See TracChangeset for help on using the changeset viewer.