Changeset 26479


Ignore:
Timestamp:
10/13/21 09:57:34 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: fixing style and AD after Vincent's commit

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

Legend:

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

    r26478 r26479  
    36043604/*}}}*/
    36053605void       Element::SmbautoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin){/*{{{*/
     3606
    36063607        const int numvertices = this->GetNumberOfVertices();
    36073608        int         basinid;
    36083609        IssmDouble  tspin,beta0_basin,beta1_basin,noisespin_basin; //initialize scalars
    3609         IssmDouble* phi_basin               = xNew<IssmDouble>(arorder);
    3610    IssmDouble* smbspin                 = xNew<IssmDouble>(numvertices*arorder);
     3610        IssmDouble* phi_basin   = xNew<IssmDouble>(arorder);
     3611   IssmDouble* smbspin     = xNew<IssmDouble>(numvertices*arorder);
     3612
     3613        /*Get Basin ID*/
    36113614        this->GetInputValue(&basinid,SmbBasinsIdEnum);
    3612         for(int ii{0};ii<arorder;ii++){phi_basin[ii] = phi[basinid*arorder+ii];}
     3615
     3616        for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii];
     3617
    36133618        beta0_basin   = beta0[basinid];
    36143619        beta1_basin   = beta1[basinid];
    3615         for(int jj{0};jj<nspin;jj++){   
     3620        for(int jj=0;jj<nspin;jj++){   
    36163621                tspin = starttime-((nspin-jj)*tstep_ar); //current time in spin-up loop
    36173622      noisespin_basin = noisespin[jj*numbasins+basinid];
    3618       IssmDouble* oldsmbspin = xNewZeroInit<IssmDouble>(numvertices*arorder);
    3619       for(int ii{0};ii<numvertices*arorder;ii++){oldsmbspin[ii]=smbspin[ii];} //copy smbspin in oldsmbspin
     3623      IssmDouble* oldsmbspin = xNew<IssmDouble>(numvertices*arorder);
     3624      for(int ii=0;ii<numvertices*arorder;ii++) oldsmbspin[ii]=smbspin[ii]; //copy smbspin in oldsmbspin
     3625
    36203626      for(int v=0;v<numvertices;v++){
    3621          double autoregressionterm{0.0};
    3622          for(int ii{0};ii<arorder;ii++){autoregressionterm += phi_basin[ii]*smbspin[v+ii*numvertices];}
     3627         IssmDouble autoregressionterm = 0.;
     3628         for(int ii=0;ii<arorder;ii++) autoregressionterm += phi_basin[ii]*smbspin[v+ii*numvertices];
    36233629         smbspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm+noisespin_basin; //compute newest values in smbspin
    36243630      }
    3625       for(int ii{0};ii<(arorder-1)*numvertices;ii++){smbspin[ii+numvertices]=oldsmbspin[ii];} //correct older values in smbspin
    3626       xDelete<IssmDouble>(oldsmbspin); //cleanup
    3627         }
    3628         this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,smbspin,numvertices*arorder);//save spin-up autoregression values
    3629    xDelete<IssmDouble>(smbspin); //cleanup
    3630    xDelete<IssmDouble>(phi_basin); //cleanup
     3631
     3632                /*correct older values in smbspin*/
     3633      for(int ii=0;ii<(arorder-1)*numvertices;ii++){
     3634                        smbspin[ii+numvertices]=oldsmbspin[ii];
     3635                }
     3636
     3637      xDelete<IssmDouble>(oldsmbspin);
     3638        }
     3639        this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,smbspin,numvertices*arorder);
     3640
     3641        /*Cleanup and return*/
     3642   xDelete<IssmDouble>(smbspin);
     3643   xDelete<IssmDouble>(phi_basin);
    36313644}/*}}}*/
    36323645void       Element::Smbautoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms){/*{{{*/
     
    36343647        int         basinid,M,N;
    36353648        IssmDouble  beta0_basin,beta1_basin,noise_basin; //initialize scalars
    3636         IssmDouble* phi_basin               = xNew<IssmDouble>(arorder);
    3637    IssmDouble* smblist                 = xNew<IssmDouble>(numvertices);
     3649        IssmDouble* phi_basin  = xNew<IssmDouble>(arorder);
     3650   IssmDouble* smblist    = xNew<IssmDouble>(numvertices);
    36383651        IssmDouble* smbvaluesautoregression = NULL; //array for past SMB values that we are about to retrieve
     3652
    36393653        this->GetInputValue(&basinid,SmbBasinsIdEnum);
    3640         for(int ii{0};ii<arorder;ii++){phi_basin[ii] = phi[basinid*arorder+ii];}
     3654
     3655        for(int ii=0;ii<arorder;ii++){phi_basin[ii] = phi[basinid*arorder+ii];}
    36413656        beta0_basin   = beta0[basinid];
    36423657        beta1_basin   = beta1[basinid];
     
    36463661        if(isstepforar==false){
    36473662                //VV do something with the lapse rate here if needed (12Oct2021)
    3648       for(int ii{0};ii<numvertices;ii++){smblist[ii]=smbvaluesautoregression[ii];}
     3663      for(int ii=0;ii<numvertices;ii++){smblist[ii]=smbvaluesautoregression[ii];}
    36493664        }
    36503665        /*If AR model timestep: compute SMB values on vertices from AR*/
    36513666        else{
    36523667                for(int v=0;v<numvertices;v++){
    3653                         double autoregressionterm{0.0};
    3654                         for(int ii{0};ii<arorder;ii++){autoregressionterm += phi_basin[ii]*smbvaluesautoregression[v+ii*numvertices];} //compute autoregressive term
    3655                         smblist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin; //stochastic SMB value
     3668
     3669                        /*compute autoregressive term*/
     3670                        IssmDouble autoregressionterm=0.;
     3671                        for(int ii=0;ii<arorder;ii++){
     3672                                autoregressionterm += phi_basin[ii]*smbvaluesautoregression[v+ii*numvertices];
     3673                        }
     3674
     3675                        /*stochastic SMB value*/
     3676                        smblist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin;
    36563677                }
    36573678                /*Update autoregression smb values*/
    36583679                IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
    3659                 for(int ii{0};ii<numvertices;ii++){temparray[ii] = smblist[ii];} //first store newly computed smb values
    3660                 for(int ii{0};ii<(arorder-1)*numvertices;ii++){temparray[ii+numvertices] = smbvaluesautoregression[ii];} //second shift older smb values
     3680                for(int ii=0;ii<numvertices;ii++) temparray[ii] = smblist[ii]; //first store newly computed smb values
     3681                for(int ii=0;ii<(arorder-1)*numvertices;ii++){
     3682                        temparray[ii+numvertices] = smbvaluesautoregression[ii];
     3683                } //second shift older smb values
    36613684                this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); //save updated autoregression values
    36623685                xDelete<IssmDouble>(temparray); //cleanup
     
    36643687        /*Add input to element*/
    36653688        this->AddInput(SmbMassBalanceEnum,smblist,P1Enum);
     3689
    36663690        /*Cleanup*/
    36673691        xDelete<IssmDouble>(phi_basin);
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r26477 r26479  
    33 */
    44
     5#include <config.h>
    56#include "./SurfaceMassBalancex.h"
    67#include "../../shared/shared.h"
     
    195196        /*Determine if this is a time step for the AR model*/
    196197        bool isstepforar{false};
    197    if((std::fmod(time,tstep_ar)<std::fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt){isstepforar = true;}
     198
     199        #ifndef _HAVE_AD_
     200   if((fmod(time,tstep_ar)<fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt){isstepforar = true;}
     201        #else
     202        _error_("not implemented yet");
     203        #endif
     204
    198205        /*Load parameters*/
    199206        int M,N,Nphi,arorder,numbasins;
  • issm/trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp

    r26477 r26479  
    677677   Follows the Cholesky–Banachiewicz algorithm
    678678   Lchol should point to an IssmDouble* of same dimensions as A*/
    679    for(int ii{0};ii<(ndim*ndim);ii++){Lchol[ii]=0;}; //ensure zero-initialization
    680    for(int ii{0};ii<ndim;ii++){
    681                 for(int jj{0};jj<=ii;jj++){
    682                         double sum{0.0};
    683                         for(int kk{0};kk<jj;kk++) {
    684                                 sum += Lchol[ii*ndim+kk]*Lchol[jj*ndim+kk];
    685                         }
    686                         if(ii==jj){Lchol[ii*ndim+jj] = sqrt(A[ii*ndim+jj]-sum);}
    687                         else{Lchol[ii*ndim+jj] = 1/Lchol[jj*ndim+jj] * (A[ii*ndim+jj]-sum);}
    688                 }
    689         }
     679
     680        /*ensure zero-initialization*/
     681        for(int ii=0;ii<(ndim*ndim);ii++) Lchol[ii]=0;;
     682
     683        for(int ii=0;ii<ndim;ii++){
     684                for(int jj{0};jj<=ii;jj++){
     685                        IssmDouble sum=0.;
     686                        for(int kk{0};kk<jj;kk++){
     687                                sum += Lchol[ii*ndim+kk]*Lchol[jj*ndim+kk];
     688                        }
     689                        if(ii==jj){
     690                                Lchol[ii*ndim+jj] = sqrt(A[ii*ndim+jj]-sum);
     691                        }
     692                        else{
     693                                Lchol[ii*ndim+jj] = 1./Lchol[jj*ndim+jj] * (A[ii*ndim+jj]-sum);
     694                        }
     695                }
     696        }
    690697} /*}}}*/
  • issm/trunk-jpl/src/c/shared/Random/random.cpp

    r26477 r26479  
    2020/*}}}*/
    2121
    22 void univariateNormal(IssmDouble* prand, IssmDouble mean, IssmDouble sdev) { /*{{{*/
     22void univariateNormal(IssmPDouble* prand, IssmPDouble mean, IssmPDouble sdev) { /*{{{*/
    2323        /*univariateNormal      generates a random value follwoing Normal distribution*/
    2424        unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count(); //random seed using time_since_epoch
    2525   std::default_random_engine generator(seed); //generator of random numbers
    26    std::normal_distribution<double> normdistri(mean,sdev); //Normal probability distribution
    27         double tfunc;
     26   std::normal_distribution<IssmPDouble> normdistri(mean,sdev); //Normal probability distribution
    2827        *prand = normdistri(generator);
    2928} /*}}}*/
    3029void multivariateNormal(IssmDouble** prand, int dim, IssmDouble mean, IssmDouble* covariancematrix) { /*{{{*/
    31    IssmDouble* sampleStandardNormal     = xNew<IssmDouble>(dim);
     30   IssmPDouble* sampleStandardNormal     = xNew<IssmPDouble>(dim);
    3231   IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
    3332   IssmDouble* Lchol                    = xNewZeroInit<IssmDouble>(dim*dim);
    34    for(int ii{0};ii<dim;ii++){univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);}
     33
     34   for(int ii=0;ii<dim;ii++){univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);}
    3535   CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
    36    for(int ii{0};ii<dim;ii++){ //matrix by vector multiplication
    37       double sum{0.0};
    38       for(int jj{0};jj<dim;jj++){sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];} //entry-by-entry multiplication along matrix row
    39       sampleMultivariateNormal[ii] = mean+sum; //assign value
     36   for(int ii=0;ii<dim;ii++){ //matrix by vector multiplication
     37      /*entry-by-entry multiplication along matrix row*/
     38      IssmDouble sum=0.;
     39      for(int jj{0};jj<dim;jj++){
     40         sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];
     41      }
     42      sampleMultivariateNormal[ii] = mean+sum;
    4043   }
     44
     45   /*Assign output pointer and cleanup*/
    4146   *prand = sampleMultivariateNormal;
    42    xDelete<IssmDouble>(sampleStandardNormal);
     47   xDelete<IssmPDouble>(sampleStandardNormal);
    4348   xDelete<IssmDouble>(Lchol);
    4449} /*}}}*/
    4550void multivariateNormal(IssmDouble** prand, int dim, IssmDouble* mean, IssmDouble* covariancematrix) { /*{{{*/
    46         IssmDouble* sampleStandardNormal     = xNew<IssmDouble>(dim);
     51        IssmPDouble* sampleStandardNormal     = xNew<IssmPDouble>(dim);
    4752        IssmDouble* sampleMultivariateNormal = xNew<IssmDouble>(dim);
    4853        IssmDouble* Lchol                    = xNewZeroInit<IssmDouble>(dim*dim);
    49         for(int ii{0};ii<dim;ii++){univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);}
     54        for(int ii=0;ii<dim;ii++) univariateNormal(&(sampleStandardNormal[ii]),0.0,1.0);
     55
    5056        CholeskyRealPositiveDefinite(Lchol,covariancematrix,dim);
    51         for(int ii{0};ii<dim;ii++){ //matrix by vector multiplication
    52                 double sum{0.0};
    53       for(int jj{0};jj<dim;jj++){sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];} //entry-by-entry multiplication along matrix row
     57
     58        for(int ii=0;ii<dim;ii++){ //matrix by vector multiplication
     59                IssmDouble sum = 0.;
     60      for(int jj=0.;jj<dim;jj++){
     61                        sum += sampleStandardNormal[jj]*Lchol[ii*dim+jj];
     62                }
    5463      sampleMultivariateNormal[ii] = mean[ii]+sum; //assign value
    5564        }
    5665        *prand = sampleMultivariateNormal;
    57         xDelete<IssmDouble>(sampleStandardNormal);
     66        xDelete<IssmPDouble>(sampleStandardNormal);
    5867        xDelete<IssmDouble>(Lchol);
    5968} /*}}}*/
Note: See TracChangeset for help on using the changeset viewer.