Changeset 22703


Ignore:
Timestamp:
04/20/18 13:50:45 (7 years ago)
Author:
seroussi
Message:

NEW: adding coupling in regular time steps

Location:
issm/trunk-jpl/src/c
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r22656 r22703  
    7676        #endif
    7777
    78         if(isoceancoupling){
     78        if(isoceancoupling){ {{{
    7979                if(VerboseSolution()) _printf0_("   ocean coupling: initialization \n");
    8080                int my_rank;
    81                 int oceannxsize,oceannysize;
     81                int oceangridnxsize,oceangridnysize;
    8282                IssmDouble *oceangridx;
    8383                IssmDouble *oceangridy;
     
    9797                        ISSM_MPI_Send(&time,1,ISSM_MPI_DOUBLE,0,10001001,tomitgcmcomm);
    9898                        ISSM_MPI_Recv(&oceantime,1,ISSM_MPI_DOUBLE,0,10001002,tomitgcmcomm,&status);
    99                         ISSM_MPI_Recv(&oceannxsize,1,ISSM_MPI_INT,0,10001003,tomitgcmcomm,&status);
    100                         ISSM_MPI_Recv(&oceannysize,1,ISSM_MPI_INT,0,10001004,tomitgcmcomm,&status);
    101                         oceangridx = xNew<IssmDouble>(oceannxsize*oceannysize);
    102                         ISSM_MPI_Recv(oceangridx,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001005,tomitgcmcomm,&status);
    103                         oceangridy = xNew<IssmDouble>(oceannxsize*oceannysize);
    104                         ISSM_MPI_Recv(oceangridy,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001006,tomitgcmcomm,&status);
    105                         icebase = xNew<IssmDouble>(oceannxsize*oceannysize);
    106                         for(int i=0;i<oceannxsize;i++){
    107                                 for(int j=0;j<oceannysize;j++){
    108                                         icebase[i*oceannysize+j]=2*oceangridx[i*oceannysize+j];
    109                                 }
    110                         }
    111                         ISSM_MPI_Send(icebase,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
    112                         oceanmelt = xNew<IssmDouble>(oceannxsize*oceannysize);
    113                         ISSM_MPI_Recv(oceanmelt,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
     99                        ISSM_MPI_Recv(&oceangridnxsize,1,ISSM_MPI_INT,0,10001003,tomitgcmcomm,&status);
     100                        ISSM_MPI_Recv(&oceangridnysize,1,ISSM_MPI_INT,0,10001004,tomitgcmcomm,&status);
     101                        femmodel->parameters->SetParam(oceangridnxsize,OceanGridNxEnum);
     102                        femmodel->parameters->SetParam(oceangridnysize,OceanGridNyEnum);
     103                        oceangridx = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
     104                        ISSM_MPI_Recv(oceangridx,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001005,tomitgcmcomm,&status);
     105                        oceangridy = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
     106                        ISSM_MPI_Recv(oceangridy,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001006,tomitgcmcomm,&status);
     107                        icebase = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
     108                        for(int i=0;i<oceangridnxsize;i++){
     109                                for(int j=0;j<oceangridnysize;j++){
     110                                        icebase[i*oceangridnysize+j]=2*oceangridx[i*oceangridnysize+j];
     111                                }
     112                        }
     113                        ISSM_MPI_Send(icebase,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
     114                        oceanmelt = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
     115                        ISSM_MPI_Recv(oceanmelt,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
    114116                        xDelete<IssmDouble>(icebase);
    115117                        xDelete<IssmDouble>(oceangridx);
     
    118120                }
    119121        }
     122        }}}
    120123
    121124                IssmDouble  output_value;
     
    162165                femmodel->parameters->SetParam(save_results,SaveResultsEnum);
    163166
     167                if(isoceancoupling){ {{{
     168                        if(VerboseSolution()) _printf0_("   ocean coupling: sending ice base\n");
     169                        int my_rank;
     170                        int oceangridnxsize,oceangridnysize;
     171                        IssmDouble *icebase;
     172                        IssmDouble oceantime;
     173                        ISSM_MPI_Comm tomitgcmcomm;
     174                        ISSM_MPI_Status status;
     175
     176                        my_rank=IssmComm::GetRank();
     177                        GenericParam<ISSM_MPI_Comm>* parcom = dynamic_cast<GenericParam<ISSM_MPI_Comm>*>(femmodel->parameters->FindParamObject(ToMITgcmCommEnum));
     178                        if(!parcom)_error_("TransferForcing error message: could not find ToMITgcmCommEnum communicator");
     179                        tomitgcmcomm=parcom->GetParameterValue();
     180                        if(my_rank==0){
     181                                ISSM_MPI_Send(&time,1,ISSM_MPI_DOUBLE,0,10001001,tomitgcmcomm);
     182                                ISSM_MPI_Recv(&oceantime,1,ISSM_MPI_DOUBLE,0,10001002,tomitgcmcomm,&status);
     183                                if((oceantime - time > 0.1*yts) & (oceantime - time < -0.1*yts)) _error_("Ocean and ice time are starting to diverge");
     184                                femmodel->parameters->FindParam(&oceangridnxsize,OceanGridNxEnum);
     185                                femmodel->parameters->FindParam(&oceangridnysize,OceanGridNyEnum);
     186                                for(int i=0;i<oceangridnxsize;i++){
     187                                        for(int j=0;j<oceangridnysize;j++){
     188                                                icebase[i*oceangridnysize+j]=9999.;
     189                                        }
     190                                }
     191                                ISSM_MPI_Send(icebase,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
     192                                xDelete<IssmDouble>(icebase);
     193                        }
     194                }
     195                }}}
     196
    164197                if(isthermal && domaintype==Domain3DEnum){
    165198                        if(issmb){
     
    239272                }
    240273
     274                if(isoceancoupling){ {{{
     275                        if(VerboseSolution()) _printf0_("   ocean coupling: receiving melt\n");
     276                        int my_rank;
     277                        int oceangridnxsize,oceangridnysize;
     278                        IssmDouble *oceanmelt;
     279                        ISSM_MPI_Comm tomitgcmcomm;
     280                        ISSM_MPI_Status status;
     281
     282                        my_rank=IssmComm::GetRank();
     283                        GenericParam<ISSM_MPI_Comm>* parcom = dynamic_cast<GenericParam<ISSM_MPI_Comm>*>(femmodel->parameters->FindParamObject(ToMITgcmCommEnum));
     284                        if(!parcom)_error_("TransferForcing error message: could not find ToMITgcmCommEnum communicator");
     285                        tomitgcmcomm=parcom->GetParameterValue();
     286                        if(my_rank==0){
     287                                femmodel->parameters->FindParam(&oceangridnxsize,OceanGridNxEnum);
     288                                femmodel->parameters->FindParam(&oceangridnysize,OceanGridNyEnum);
     289                                oceanmelt = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
     290                                ISSM_MPI_Recv(oceanmelt,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
     291                                xDelete<IssmDouble>(oceanmelt);
     292                        }
     293                }
     294                }}}
     295
    241296                if(recording_frequency && (step%recording_frequency==0)){
    242297                        if(VerboseSolution()) _printf0_("   checkpointing model \n");
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22702 r22703  
    206206        NodesEnum,
    207207        NumModelsEnum,
     208        OceanGridNxEnum,
     209        OceanGridNyEnum,
     210        OceanGridXEnum,
     211        OceanGridYEnum,
    208212        OutputBufferPointerEnum,
    209213        OutputBufferSizePointerEnum,
     
    476480        NeumannfluxEnum,
    477481        NodeEnum,
    478         OceanGridNxEnum,
    479         OceanGridNyEnum,
    480         OceanGridXEnum,
    481         OceanGridYEnum,
    482482        OmegaAbsGradientEnum,
    483483        P0Enum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22702 r22703  
    214214                case NodesEnum : return "Nodes";
    215215                case NumModelsEnum : return "NumModels";
     216                case OceanGridNxEnum : return "OceanGridNx";
     217                case OceanGridNyEnum : return "OceanGridNy";
     218                case OceanGridXEnum : return "OceanGridX";
     219                case OceanGridYEnum : return "OceanGridY";
    216220                case OutputBufferPointerEnum : return "OutputBufferPointer";
    217221                case OutputBufferSizePointerEnum : return "OutputBufferSizePointer";
     
    482486                case NeumannfluxEnum : return "Neumannflux";
    483487                case NodeEnum : return "Node";
    484                 case OceanGridNxEnum : return "OceanGridNx";
    485                 case OceanGridNyEnum : return "OceanGridNy";
    486                 case OceanGridXEnum : return "OceanGridX";
    487                 case OceanGridYEnum : return "OceanGridY";
    488488                case OmegaAbsGradientEnum : return "OmegaAbsGradient";
    489489                case P0Enum : return "P0";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22702 r22703  
    217217              else if (strcmp(name,"Nodes")==0) return NodesEnum;
    218218              else if (strcmp(name,"NumModels")==0) return NumModelsEnum;
     219              else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
     220              else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
     221              else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
     222              else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
    219223              else if (strcmp(name,"OutputBufferPointer")==0) return OutputBufferPointerEnum;
    220224              else if (strcmp(name,"OutputBufferSizePointer")==0) return OutputBufferSizePointerEnum;
     
    256260              else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
    257261              else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
    258               else if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
     262         else stage=3;
     263   }
     264   if(stage==3){
     265              if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
    259266              else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
    260267              else if (strcmp(name,"SettingsSolverResidueThreshold")==0) return SettingsSolverResidueThresholdEnum;
    261268              else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
    262          else stage=3;
    263    }
    264    if(stage==3){
    265               if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
     269              else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
    266270              else if (strcmp(name,"SmbAIce")==0) return SmbAIceEnum;
    267271              else if (strcmp(name,"SmbAIdx")==0) return SmbAIdxEnum;
     
    379383              else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;
    380384              else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum;
    381               else if (strcmp(name,"Base")==0) return BaseEnum;
     385         else stage=4;
     386   }
     387   if(stage==4){
     388              if (strcmp(name,"Base")==0) return BaseEnum;
    382389              else if (strcmp(name,"Bed")==0) return BedEnum;
    383390              else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
    384391              else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
    385          else stage=4;
    386    }
    387    if(stage==4){
    388               if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
     392              else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
    389393              else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
    390394              else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
     
    491495              else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
    492496              else if (strcmp(name,"Node")==0) return NodeEnum;
    493               else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
    494               else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
    495               else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
    496               else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
    497497              else if (strcmp(name,"OmegaAbsGradient")==0) return OmegaAbsGradientEnum;
    498498              else if (strcmp(name,"P0")==0) return P0Enum;
Note: See TracChangeset for help on using the changeset viewer.