/* See SOSimoMap.h. */ /* Last edited on 2003-06-30 20:02:45 by ra014852 */ #include #include #include #include #include #include #include #include #define FM FuncMap #define SD SOSimoMap_Data SOGrid_Dim uDim; /* Dimension of the function's value {u = f(p)}. */ SOGrid_Dim pDim; /* Dimension of the argument points {p}. */ SOGrid_Dim vDim; /* Dimension of the {FuncMap}'s result {v = FMap(f(p),p)}. */ int degree; double *coeff; #define FWrelpermDescr "Water Relative Permeability" /* Depends on the WATER saturation */ void FWrelperm(double *u, double *p, double *v); void FWrelperm(double *u, double *p, double *v) { double min = 0.1, max = 0.9, S; S = (double)(*u - min)/(max - min); if(S < 0.0) S = 0.0; if(S > 1.0) S = 1.0; *v = S; *v = *v * *v; } #define FOrelpermDescr "Oil Relative Permeability" /* Depends on the WATER saturation */ void FOrelperm(double *u, double *p, double *v); void FOrelperm(double *u, double *p, double *v) { double min = 0.1, max = 0.9, S; S = (double)(*u - min)/(max - min); if(S < 0.0) S = 0.0; if(S > 1.0) S = 1.0; *v = 1.0 - S; *v = *v * *v; } #define FWviscDescr "Water Viscosity" /* Depends on the OIL pressure */ void FWvisc(double *u, double *p, double *v); void FWvisc(double *u, double *p, double *v) { *v = 0.004; /* Pa-s or 0.4 mPa-s */ } #define FOviscDescr "Oil Viscosity" /* Depends on the OIL pressure */ void FOvisc(double *u, double *p, double *v); void FOvisc(double *u, double *p, double *v) { /* press: 98 039.21 Pa -> 0.05 Pa-s */ /* press: 14 705 882.35 Pa -> 0.01138 Pa-s */ // *v = -0.0000000026* *u + 0.05; *v = -0.0000000026 * *u + 0.09; // teste 1 e 2 if( *v < 0.005 ) *v = 0.005; } #define FWformDescr "Water Formation Volume Factor" /* Depends on the OIL pressure */ void FWform(double *u, double *p, double *v); void FWform(double *u, double *p, double *v) { *v = 1.00; } #define FOformDescr "Oil Formation Volume Factor" /* Depends on the OIL pressure */ void FOform(double *u, double *p, double *v); void FOform(double *u, double *p, double *v) { /* press: 98 039.21 Pa -> 1.0 m3/m3 */ /* press: 14 705 882.35 Pa -> 1.33 m3/m3 */ // *v = 1.00; *v = 0.0000000233 * *u + 0.998; if( *v < 1.0 ) *v = 1.0; } #define FWgravdenDescr "Water Gravitational Density" /* Depends on the OIL pressure */ void FWgravden(double *u, double *p, double *v); void FWgravden(double *u, double *p, double *v) { *v = 10000.0; /* 1000 kg/m3 * 10 m.s-2 */ } #define FOgravdenDescr "Oil Gravitational Density" /* Depends on the OIL pressure - Density times g ravity acceleration. */ void FOgravden(double *u, double *p, double *v); void FOgravden(double *u, double *p, double *v) { *v = 8870.0; /* 887 kg/m3 * 10 m.s-2 */ } #define FabpermDescr "Absolute Permeability" /* Depends on rock properties - Given in Darcy. */ void Fabperm(double *u, double *p, double *v); void Fabperm(double *u, double *p, double *v) { int i; double por = 1.0, margin = 0.05; // teste1 /* double por = 1.0, margin = 0.0441941738; // teste2 - half of tent level 8. */ // *v = (double) 5.0e-12; /* 5.0e-12 m2 = 500.0 md = 5 darcy */ for(i = 0; i < pDim; i++) { if(p[i] < margin) por *= (double)p[i]/margin; else if(p[i] > (1.0/pow(2.0, (double)i/pDim)) - margin) por *= (double)(1.0/pow(2.0, (double)i/pDim) - p[i])/margin; } *v = por * (double) 5.0e-10; } #define FporDescr "Rock Porosity" /* Depends on the OIL pressure - Dimentionless volume ratio. */ void Fpor(double *u, double *p, double *v); void Fpor(double *u, double *p, double *v) { int i; double margin = 0.05; // teste1 /* double margin = 0.0441941738; // teste2 - half of tent level 8. */ *v = 1.0; for(i = 0; i < pDim; i++) { if(p[i] < margin) *v *= (double)p[i]/margin; else if(p[i] > (1.0/pow(2.0, (double)i/pDim)) - margin) *v *= (double)(1.0/pow(2.0, (double)i/pDim) - p[i])/margin; } } #define FpolyDescr "General Polynomial" void Fpoly(double *u, double *p, double *v); void Fpoly(double *u, double *p, double *v) { int i, j; double ui; *v = 0.0; for(i = 0; i <= degree; i++) { ui = 1.0; for(j = 0; j < i; j++) ui *= *u; *v += ui * coeff[i]; } } #define NoData (SD){(FM){NULL, 1, pDim, 1, TRUE}, NULL} SOSimoMap_Data SOSimoMap_FromName(char *name, int Degree, double *Coeff, SOGrid_Dim p) { pDim = p; coeff = Coeff; degree = Degree; if (strcmp(name, "FWrelperm") == 0) { return (SD){(FM){&FWrelperm, 1, pDim, 1, FALSE}, FWrelpermDescr }; } if (strcmp(name, "FOrelperm") == 0) { return (SD){(FM){&FOrelperm, 1, pDim, 1, FALSE}, FOrelpermDescr }; } if (strcmp(name, "FWvisc") == 0) { return (SD){(FM){&FWvisc, 1, pDim, 1, FALSE}, FWviscDescr }; } if (strcmp(name, "FOvisc") == 0) { return (SD){(FM){&FOvisc, 1, pDim, 1, FALSE}, FOviscDescr }; } if (strcmp(name, "FWform") == 0) { return (SD){(FM){&FWform, 1, pDim, 1, FALSE}, FWformDescr }; } if (strcmp(name, "FOform") == 0) { return (SD){(FM){&FOform, 1, pDim, 1, FALSE}, FOformDescr }; } if (strcmp(name, "FWgravden") == 0) { return (SD){(FM){&FWgravden, 1, pDim, 1, FALSE}, FWgravdenDescr }; } if (strcmp(name, "FOgravden") == 0) { return (SD){(FM){&FOgravden, 1, pDim, 1, FALSE}, FOgravdenDescr }; } if (strcmp(name, "Fabperm") == 0) { return (SD){(FM){&Fabperm, 1, pDim, pDim, FALSE}, FabpermDescr }; } if (strcmp(name, "Fpor_NoMap") == 0) { return (SD){(FM){NULL, 1, pDim, 1, FALSE}, FporDescr }; } if (strcmp(name, "Fpor") == 0) { return (SD){(FM){&Fpor, 1, pDim, 1, FALSE}, FporDescr }; } if (strcmp(name, "Fpoly") == 0) { return (SD){(FM){&Fpoly, 1, pDim, 1, FALSE}, FpolyDescr }; } assert(FALSE, "unknown FuncMap name"); return NoData; }