Changeset 20683


Ignore:
Timestamp:
06/01/16 17:05:50 (9 years ago)
Author:
felicity
Message:

CHG: added rigid body correction to vorticity in Budd et al. (2013) rheology

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

Legend:

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

    r20678 r20683  
    224224
    225225        /*Intermediaries*/
    226         IssmDouble vx,vy,vz;
    227         IssmDouble dvx[3],dvy[3],dvz[3];
     226        IssmDouble vx,vy,vz,vmag;
     227        IssmDouble dvx[3],dvy[3],dvz[3],dvmag[3];
    228228        IssmDouble epso,epsprime;
    229229        int         dim;
     
    241241        int numvertices = this->GetNumberOfVertices();
    242242        IssmDouble* lambdas = xNew<IssmDouble>(numvertices);
     243        IssmDouble* vorticityx = xNew<IssmDouble>(numvertices);
     244        IssmDouble* vorticityy = xNew<IssmDouble>(numvertices);
     245        IssmDouble* vorticityz = xNew<IssmDouble>(numvertices);
     246        IssmDouble* omega_corrx = xNew<IssmDouble>(numvertices);
     247        IssmDouble* omega_corry = xNew<IssmDouble>(numvertices);
     248        IssmDouble* omega_corrz = xNew<IssmDouble>(numvertices);
    243249
    244250        /* Start looping on the number of vertices: */
     
    264270                        dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
    265271                }
    266                 EarlStrainrateQuantities(&epso,&epsprime,vx,vy,vz,&dvx[0],&dvy[0],&dvz[0]);
     272                /*Calculate velocity magnitude and its derivative*/
     273                vmag = sqrt(vx*vx+vy*vy+vz*vz);
     274                if(vmag<1e-12){
     275                        vmag=1e-12;
     276                        dvmag[0]=0;
     277                        dvmag[1]=0;
     278                        dvmag[2]=0;
     279                }
     280                else{
     281                        dvmag[0]=1./(2*sqrt(vmag))*(2*vx*dvx[0]+2*vy*dvy[0]+2*vz*dvz[0]);
     282                        dvmag[1]=1./(2*sqrt(vmag))*(2*vx*dvx[1]+2*vy*dvy[1]+2*vz*dvz[1]);
     283                        dvmag[2]=1./(2*sqrt(vmag))*(2*vx*dvx[2]+2*vy*dvy[2]+2*vz*dvz[2]);
     284                }
     285                EarlStrainrateQuantities(&epso,&epsprime,vx,vy,vz,vmag,&dvx[0],&dvy[0],&dvz[0],&dvmag[0]);
    267286                lambdas[iv]=EarlLambdaS(epso,epsprime);
     287                vorticityx[iv]=dvz[1]-dvy[2];
     288                vorticityy[iv]=dvx[2]-dvz[0];
     289                vorticityz[iv]=dvy[0]-dvx[1];
     290                omega_corrx[iv] = -vorticityx[iv] + 2*(dvmag[1]*vz - dvmag[2]*vy)/vmag;
     291                omega_corry[iv] = -vorticityy[iv] + 2*(dvmag[2]*vx - dvmag[0]*vz)/vmag;
     292                omega_corrz[iv] = -vorticityz[iv] + 2*(dvmag[0]*vy - dvmag[1]*vx)/vmag;
    268293        }
    269294
    270295        /*Add Stress tensor components into inputs*/
    271296        this->AddInput(LambdaSEnum,lambdas,P1Enum);
    272 
     297        this->AddInput(Outputdefinition21Enum,vorticityx,P1Enum);
     298        this->AddInput(Outputdefinition22Enum,vorticityy,P1Enum);
     299        this->AddInput(Outputdefinition23Enum,vorticityz,P1Enum);
     300        this->AddInput(Outputdefinition31Enum,omega_corrx,P1Enum);
     301        this->AddInput(Outputdefinition32Enum,omega_corry,P1Enum);
     302        this->AddInput(Outputdefinition33Enum,omega_corrz,P1Enum);
     303       
    273304        /*Clean up and return*/
    274305        delete gauss;
  • TabularUnified issm/trunk-jpl/src/c/classes/Materials/Matearl.cpp

    r20678 r20683  
    409409        IssmDouble E,lambdas;
    410410        IssmDouble epso,epsprime_norm;
    411        
    412         EarlStrainrateQuantities(&epso,&epsprime_norm,vx,vy,vz,&dvx[0],&dvy[0],&dvz[0]);
     411        IssmDouble vmag,dvmag[3];
     412
     413        /*Calculate velocity magnitude and its derivative*/
     414        vmag = sqrt(vx*vx+vy*vy+vz*vz);
     415        if(vmag<1e-12){
     416                dvmag[0]=0;
     417                dvmag[1]=0;
     418                dvmag[2]=0;
     419        }
     420        else{
     421                dvmag[0]=1./(2*sqrt(vmag))*(2*vx*dvx[0]+2*vy*dvy[0]+2*vz*dvz[0]);
     422                dvmag[1]=1./(2*sqrt(vmag))*(2*vx*dvx[1]+2*vy*dvy[1]+2*vz*dvz[1]);
     423                dvmag[2]=1./(2*sqrt(vmag))*(2*vx*dvx[2]+2*vy*dvy[2]+2*vz*dvz[2]);
     424        }
     425
     426        EarlStrainrateQuantities(&epso,&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]);
    413427        lambdas=EarlLambdaS(epso,epsprime_norm);
    414428
  • TabularUnified issm/trunk-jpl/src/c/shared/Elements/EarlComponents.cpp

    r20678 r20683  
    22#include "../Numerics/types.h"
    33#include "../Exceptions/exceptions.h"
    4 
    5 void EarlStrainrateQuantities(IssmDouble *pepso, IssmDouble *pepsprime_norm, IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz){/*{{{*/
     4#include "./elements.h"
     5void EarlStrainrateQuantities(IssmDouble *pepso, IssmDouble *pepsprime_norm, IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble vmag,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble* dvmag){/*{{{*/
    66
    77        /*Intermediaries*/
    8         IssmDouble vorticity[3],vorticity_norm;
     8        IssmDouble omega[3],omega_norm;
    99        IssmDouble nrsp[3],nrsp_norm;
    1010        IssmDouble eps[3][3],epso;
    1111        IssmDouble epsprime[3],epsprime_norm;
    1212
    13         /*Create vorticity vector*/
    14         _assert_(dvx && dvy && dvz);
    15         vorticity[0] =  dvz[1] - dvy[2];
    16         vorticity[1] =  dvx[2] - dvz[0];
    17         vorticity[2] =  dvy[0] - dvx[1];
    18 
    19         /*Normalize*/
    20         vorticity_norm = sqrt(vorticity[0]*vorticity[0] + vorticity[1]*vorticity[1] + vorticity[2]*vorticity[2]);
    21         if(vorticity_norm==0){
    22                 vorticity[0] = 0.;
    23                 vorticity[1] = 0.;
    24                 vorticity[2] = 1.;
    25         }
    26         else{
    27                 vorticity[0] =vorticity[0]/vorticity_norm;
    28                 vorticity[1] =vorticity[1]/vorticity_norm;
    29                 vorticity[2] =vorticity[2]/vorticity_norm;
    30         }
     13        /*Get omega, correction for rigid body rotation*/
     14        EarlOmega(&omega[0],vx,vy,vz,vmag,dvx,dvy,dvz,dvmag);
    3115
    3216        /*Non-rotating shear plane*/
    33         nrsp[0] =  vy*vorticity[2] - vz*vorticity[1];
    34         nrsp[1] =  vz*vorticity[0] - vx*vorticity[2];
    35         nrsp[2] =  vx*vorticity[1] - vy*vorticity[0];
     17        nrsp[0] =  vy*omega[2] - vz*omega[1];
     18        nrsp[1] =  vz*omega[0] - vx*omega[2];
     19        nrsp[2] =  vx*omega[1] - vy*omega[0];
    3620
    3721        /*Normalize*/
     
    8165                for(int j=0;j<3;j++){
    8266                        for(int k=0;k<3;k++){
    83                                 epsprime[j] += -nrsp[i]*eps[i][k]*vorticity[k]*vorticity[j];
     67                                epsprime[j] += -nrsp[i]*eps[i][k]*omega[k]*omega[j];
    8468                        }
    8569                }
     
    8872        /*Get norm of epsprime*/
    8973        epsprime_norm = sqrt(epsprime[0]*epsprime[0] + epsprime[1]*epsprime[1] + epsprime[2]*epsprime[2]);
    90 
     74       
    9175        /*Assign output pointers*/
    9276        *pepso=epso;
    9377        *pepsprime_norm=epsprime_norm;
     78}/*}}}*/
     79void EarlOmega(IssmDouble* omega,IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble vmag,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz, IssmDouble* dvmag){/*{{{*/
     80
     81        /*Intermediaries*/
     82        IssmDouble omega_norm;
     83
     84        /*Create vorticity vector*/
     85        _assert_(dvx && dvy && dvz && dvmag);
     86        if(vmag<1e-12)vmag=1e-12;
     87
     88        /*Create vorticity vector, corrected for rigid body rotation
     89         * \overline{\omega} =\omega - \Omega
     90         *                   =-\nabla\times{\bf v} - 2*\nabla U\times{\bf v}/U;
     91         * check the magnitude of the second term -- if it is small, then the two
     92         * vorticities (omega and first term in omega) are approx. equal
     93         *
     94         * */
     95        omega[0] = -(dvz[1] - dvy[2]) + 2*(dvmag[1]*vz - dvmag[2]*vy)/vmag;
     96        omega[1] = -(dvx[2] - dvz[0]) + 2*(dvmag[2]*vx - dvmag[0]*vz)/vmag;
     97        omega[2] = -(dvy[0] - dvx[1]) + 2*(dvmag[0]*vy - dvmag[1]*vx)/vmag;
     98
     99        /*Take out vorticity component aligned with the velocity*/
     100        IssmDouble wdotv = vx/vmag*omega[0] + vy/vmag*omega[1] + vz/vmag*omega[2];
     101        omega[0] = omega[0] - wdotv*vx/vmag;
     102        omega[1] = omega[1] - wdotv*vy/vmag;
     103        omega[2] = omega[2] - wdotv*vz/vmag;
     104
     105        /*Normalize*/
     106        omega_norm = sqrt(omega[0]*omega[0] + omega[1]*omega[1] + omega[2]*omega[2]);
     107        if(omega_norm==0){
     108                omega[0] = 0.;
     109                omega[1] = 0.;
     110                omega[2] = 1.;
     111        }
     112        else{
     113                omega[0] =omega[0]/omega_norm;
     114                omega[1] =omega[1]/omega_norm;
     115                omega[2] =omega[2]/omega_norm;
     116        }
     117
    94118}/*}}}*/
    95119IssmDouble EarlLambdaS(IssmDouble epso, IssmDouble epsprime_norm){/*{{{*/
  • TabularUnified issm/trunk-jpl/src/c/shared/Elements/elements.h

    r20678 r20683  
    1616// IssmDouble LliboutryDuval(IssmDouble temperature, IssmDouble waterfraction, IssmDouble depth,IssmDouble n);
    1717IssmDouble EarlLambdaS(IssmDouble epso, IssmDouble epsprime_norm);
    18 void EarlStrainrateQuantities(IssmDouble *pepso, IssmDouble *pepsprime_norm, IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz);
     18void EarlOmega(IssmDouble* omega,IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble vmag,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz, IssmDouble* dvmag);
     19void EarlStrainrateQuantities(IssmDouble *pepso, IssmDouble *pepsprime_norm, IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble vmag,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble* dvmag);
    1920IssmDouble PddSurfaceMassBalance(IssmDouble* monthlytemperatures,  IssmDouble* monthlyprec,
    2021                                 IssmDouble* pdds, IssmDouble* pds, IssmDouble* melt, IssmDouble* accu, IssmDouble signorm,
Note: See TracChangeset for help on using the changeset viewer.