UNPKG

simclimat-lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

1 lines 179 kB
{"version":3,"file":"simclimat-lib.mjs","sources":["../../../projects/simclimat-lib/src/lib/simclimat-lib.utils.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.logger.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.physics-constants.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.model-vars.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.model.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.data-array.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.simulation-values.ts","../../../projects/simclimat-lib/src/lib/simclimat-lib.experience-values.ts","../../../projects/simclimat-lib/src/public-api.ts","../../../projects/simclimat-lib/src/simclimat-lib.ts"],"sourcesContent":["\nexport function add( num1: number, num2: number )\n{\n return num1 + num2;\n}\n","\nexport class CLogger {\n static debug: boolean = false;\n\n static log( message: any, logLevel: String = 'info' ) : void \n {\n if ( ! this.debug )\n {\n return ;\n }\n\n switch ( logLevel )\n {\n case 'debug': {\n console.info( message );\n break;\n }\n \n case 'info': {\n console.log( message );\n break;\n }\n \n case 'warning': {\n console.log( 'WARNING : ' + message );\n \n break;\n }\n\n case 'error': {\n console.error( 'ERROR : ' + message );\n \n break;\n }\n\n default: {\n console.log( message );\n break;\n }\n }\n } // eo log method\n\n\n static setDebug( debug: boolean ) : void\n {\n this.debug = debug;\n }\n}","import {CLogger} from './simclimat-lib.logger';\n\n/**\n * This class define physics constants and calculated physics constants.\n *\n * Instanciation example : \n * \n * ```typescript\n * const instance = new CPhysicsConstants();\n * ```\n * \n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n * \n * @author Alain Deseine\n * \n * @copyright CEI Alain Deseine 1992-2019\n * \n * @beta \n */\n\nexport class CPhysicsConstants {\n\n // Constantes mathématiques\n \n /** Pi math constant */\n public static readonly pi: number = Math.PI; \n\n // constantes radiatives\n public static readonly puissance_recue_zero: number = 1370 / 4.;\n public static readonly distance_ts_actuelle: number = 1.5e11;\n public static readonly sigma: number = 5.67e-8;\n\n // constantes du calcul de l'albédo \n public static readonly albedo_froid: number = 0.65;\n public static readonly albedo_chaud: number = 0.325;\n public static readonly temperature_froid: number = 262;\n public static readonly temperature_chaud: number = 286;\n\n\n // constantes des GES (Gaz à effet de serre) \n // conversions de Gt à ppm: \n\n /** 5.13e6 en Gt */\n public static readonly masse_atmosphere_Gt: number = 1.4e6; \n\n /** Exprimée eng/mol */\n public static readonly masse_molaire_coo: number = 44; \n public static readonly masse_molaire_chhhh: number = 16;\n public static readonly masse_molaire_air: number = 29;\n\n // concentrations actuelles et naturelles \n public static readonly concentration_coo_actuel: number = 405; // ppm\n public static readonly concentration_coo_2007: number = 370; // ppm: ajout mars 2022\n public static readonly concentration_coo_1750: number = 280;\n public static readonly concentration_coo_naturel: number = 280;\n public static readonly concentration_coo_min: number = 1e-1; // pour ne pas avoir de nan en prenant le log\n public static readonly coo_Gt_act: number = 750; // masse de CO2 en Gt\n public static readonly coo_Gt_2007: number = 750; // masse de CO2 en Gt: ajout mars 2022\n public static readonly coo_Gt_1750: number = 280 * 750 / 370; // masse de CO2 en Gt\n public static readonly concentration_coo_glaciaire: number = 180; // ppm\n\n // constantes radiatives\n public static readonly a_coo: number = 22e-3; // 5.35; On peut changer cette valeur sans changer l'equilibre pre-industriel.\n public static readonly concentration_coo_limite: number = 10000; // en ppm, la limite entre relation linéaire et log pour forcage serre\n\n // pour extrapolations lin pour hautes concentrations\n public static readonly concentration_coo_limite_bas: number = 100; // en ppm,idem pour extrapolation pour basses concnetrations\n public static readonly G_min: number = 1e-4; // forcage_serre min, pour eviter des nan\n\n // temps de résidence\n public readonly t_res_coo_actuel: number;\n\n // on calcule tel qu'a l'équilibre, sans emissions humaines, concentration en C02=emission*temps de résidence=280ppm\n public readonly t_res_coo_90: number;\n public static readonly t_res_coo_0: number = 1.5e6;\n public static readonly niveau_calotte_critique_coo: number = 20;\n public static readonly niveau_calottes_1750: number = 60;\n public readonly t_res_coo_critique: number;\n // const double facteur_alteration_0=1e-3;\t\n // const double facteur_alteration_90=1;\t\n\n // températures\n public static readonly tau_temperature: number = 30; // en années\n public static readonly temperature_actuelle: number = 15.5; // en °C ; necessaire dans modele_reset\n\n // calculée à la main pour C02=370 et albédo=albédo_actuel\n // public readonly temperature_1900: number;\n public static readonly temperature_1750: number = 14.4;\n public readonly deltaT_last_century: number \n public static readonly temperature_LGM: number = 10;\n public static readonly C_terre: number = 5e9; // capacité calorifique de la Terre en J/K/m2\n public static readonly Tkelvin: number = 273.0;\n\n // données radiatives sur l'actuel\n public static readonly albedo_1750: number = 0.33;\n public readonly G0: number;\n\n // données et constantes de bidouille sur le niveau de la mer\n /** Facteur de pondération de la température il y a [[deltat0]] ans */\n // constantes commentées par Camille le 19 avril 2024 car sont inutiles\n // public static readonly p0: number = 1.; \n // public static readonly p1: number = 5.;\n // public static readonly p2: number = 3.;\n // public static readonly p3: number = 1.;\n\n /** Retard en temps en année */\n public static readonly deltat0: number = 0.; \n public static readonly deltat1: number = 5.;\n public static readonly deltat2: number = 20.;\n public static readonly deltat3: number = 50.;\n public static readonly C_niveau: number = 100.; // orig=96\n public static readonly a_mer: number = 140;\n public static readonly tmemoire_niveau_mer = 100.; // le 30 janvier 2011: en fait, tau_niveau_mer ne peut dépasser 100 ans car c'est la mémoire maximale d'une simul pour la simul précédente. # c est le pas de temps utilise pour calculer l effet memoire.\n public static readonly tau_niveau_mer = 1000.; // c est l echelle de temps caracteristique de l evolution de la temperature de l ocean\n public readonly pond_memoire_mer\n // public readonly T_ressentie_actuelle: number; // commenté le 19 avril 2024 par Camille car c'est inutile\n\n // niveau mer exprimé en m /t actuel\n public static readonly niveau_mer_LGM: number = -130;\n \n // modif CR 4 nov 2019: on le calcule de maniere plus exacte plus bas\n // public static readonly niveau_mer_1750: number = -0.2; // en m\n public readonly Hmer_1750: number;\n public readonly niveau_mer_1750: number;\n\n // niveau des calottes\n public static readonly niveau_calottes_LGM: number = 45;\n public static readonly niveau_calottes_LGM_noinsol: number = 52;\n public static readonly tau_niveau_calottes_englacement: number = 5000.;\n public static readonly tau_niveau_calottes_deglacement: number = 5000.;\n public readonly a_calottes: number;\n\n // Une variation globale glaviaire-interglaciaire correspond à environ 5 à 10°C.\n public readonly b_calottes: number;\n public static readonly niveau_calottes_min: number = 0;\n public static readonly niveau_calottes_max: number = 90;\n public readonly niveau_calottes_actuel: number;\n\n // nouveau traitement niveau de la mer\n // public static readonly Hmer_tot: number = 3.8e3; // en m // remplacé par Camille le 19 avril 2024 par un paramètre ajustable pour que niveau mer LGM -100m sans dilatation\n public static Hmer_tot: number;\n public static readonly dilat: number = 2.4e-4; // en °C \n public static readonly coef_dilat: number = 2.0; // c'est un param ajustable pour ajuster la dilatation. Avant on n'en avait pas besoin parce que Hmer_tot réaliste, mais là, on l'ajuste su le changement de niveau mer du LGM\n public readonly Tressentie_act: number;\n // public readonly fphig1: number;\n // public static readonly fphig2: number = 0.10e-4;\n public readonly dilatation_1750: number;\n // public readonly optim1: number;\n // public readonly optim2: number;\n public static readonly expmer: number = 1.5; // constante ajoutée le 19 avril 2024 par Camille. C'est un exposant qui sert de maramètre ajustable pour que niveau_mer_1750 soit à peu près égale à -0.2 m.\n\n // modif CR 4 nov 2019, pour avoir niveau_mer_1750=-0.2 de maniere plus exacte\n // public static readonly fphig3: number = -1.99447e-7; // plein de constantes supprimée le 19 avril 2024 par Camille car on change le calcul du niveau des mers\n\n // tel que l'on soit à l'équilibre à niveau_mer_1750 en 1750\n // et tel que -120m au LGM\n public readonly Hmeract: number;\n // public static readonly niveau_mer_1750_target: number\t = -0.2; // commenté le 19 avril 2024 par Camille\n\n // flux de carbone\n // const double CO2_biologique_eq=concentration_coo_naturel;\n // calcul CO2_ocean_eq en fonction temp�rature\n public static readonly a_CO2_eq: number = 20; // ppm/°C\t\t\n public static readonly emit_anthro_coo_act: number = 12; // Gt: mise à jour mars 2022\n public static readonly volcanisme_actuel: number = 0.083; // en Gt/an\n public static readonly puit_ocean_act: number = 20.0; // en pourcent des emissions anthro absorbées\n \n // const double B_ocean=-puit_ocean_act*emit_anthro_coo_act/ (concentration_coo_actuel-concentration_coo_1750 -a_CO2_eq*(temperature_actuelle-temperature_1750));\n public readonly C_alteration_naturel: number;\n public static readonly Tlim_oce: number = 10; // en °K\n \n // const double rel_CO2_temperature=emit_anthro_coo_act/Tlim_oce;\n public static readonly b_ocean: number = 1/5000.0;\n public static readonly Tlim_oce_froid: number = 275;\n public static readonly A_oce: number = 3e-2;\n public readonly deltaT_poce: number;\n public static readonly Tcrit_oce: number = 35;\n public static readonly puit_oce_max: number = 40; // en pourcent\n public static readonly dFdegaz: number = 0.05;\n public static readonly q_CO2: number = 0.26; // CO2=26% de l'effet de serre\n\n // retroactions vapeur d'eau\n public static readonly q_H2O: number = 0.6; // eau=60% de l'effet de serre\n public readonly a_H2O: number;\n // public static readonly tau_T: number = 200; // en °K\n public static readonly rapport_H2O_actconst: number = 1.05719; // rapport pour la température actuelle\n public static readonly a_rankine: number = 13.7;\n public static readonly b_rankine: number = 5120.;\n public static readonly pow_H2O: number = 0.23; // normallement: 0.18\n\n // paramétrisation de A_biologique en fonction \tde la température\n public static readonly puit_bio_act: number = 30; // en pourcent\n public readonly Tlim_bio_froid: number;\n public static readonly Tlim_bio_chaud: number = 340; // en K\n //const double A_biologique_act=-puit_bio_act*emit_anthro_coo_act/(concentration_coo_actuel-concentration_coo_1750); // en an-1\n\n // parametres orbitaux\n public static readonly lat_Mil: number = 65;\n public static readonly c_calottes: number = 0.2;\n //const double precession_actuel=-90;\n public static readonly precession_actuel: number = 102.7; // modif 31 janv 2009: on prend la même precession que LMDZ\n // la formule de insol65N n'a pas été modifiée car 2 bugs se compensaient\n public static readonly obliquite_actuel: number = 23.5;\n public static readonly excentricite_actuel: number = 0.0167;\n public readonly delta_angle_actuel: number;\n public readonly insol_actuel: number;\n\n // albédo\n public static readonly albedo_phi_min: number = 0.60;\n public static readonly albedo_phi_max: number = 0.2;\n public static readonly albedo_glace_const: number = 0.90;\n public static readonly phig_crit: number = 30.0; // 30\n public static readonly albedo_ter: number = 0.25;\n public readonly albedo_crit: number;\n public readonly albedo_actuel: number;\n\n // calcule de la température\n public static readonly capacite_calorifique: number = 0.1;\t\n\n // stockage biologique\n public static readonly flux_co2_stockage_max: number = -10; // GT/an-1\n public readonly stockage_max: number;\n public static readonly flux_co2_stockage_carbonifere: number = -0.396; // en Gt par an d'apres R.A. Berner et D.E. Canfield (1989)\n public readonly concentration_coo_carbonifere: number;\n public readonly stockage_carbonifere: number;\n \n // logicals\n public static readonly echantillonage: number = 1;\n\t// if 1: échantillonage direct au pas de temps\n\t// if 2: échantillonage en moyennant sur les pas de temps autour du point d'échantillonage\n public static readonly calcul_carbone: number = 1;\n\t// si 1: calcul Euler explicite\n\t// si 2: calcul par decroissance vers équilibre\n\n\n /**\n * Constructor. \n * \n * The constructor of this class calculate calculated physics constants.\n *\n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n *\n * @beta\n */\n\n constructor () {\n // Set calculated physics constants\n CLogger.log( 'physics-constants: appel constructor');\n this.t_res_coo_actuel = 280 / 0.083 / ( CPhysicsConstants.concentration_coo_2007 / CPhysicsConstants.coo_Gt_2007 ); // Modification mars 2022\n this.t_res_coo_90 = this.t_res_coo_actuel * 0.9;\n this.t_res_coo_critique = this.t_res_coo_90 + ( 90 - CPhysicsConstants.niveau_calotte_critique_coo ) * - ( this.t_res_coo_90 - this.t_res_coo_actuel ) / ( 90 - CPhysicsConstants.niveau_calottes_1750 );\n\tthis.deltaT_last_century = CPhysicsConstants.temperature_actuelle-CPhysicsConstants.temperature_1750;\n //this.temperature_1900 = CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century; // en °C ; necessaire dans modele_reset\n this.G0 = CPhysicsConstants.puissance_recue_zero * ( 1 - CPhysicsConstants.albedo_1750 ) / CPhysicsConstants.sigma / Math.exp( 4 * Math.log( CPhysicsConstants.Tkelvin + CPhysicsConstants.temperature_1750 ) ); //0.584;\n \n // commenté le 19 avril 2024 par Camille car inutile\n /*\n this.T_ressentie_actuelle = ( 1. / ( CPhysicsConstants.p0 + CPhysicsConstants.p1 + CPhysicsConstants.p2 + CPhysicsConstants.p3 ) ) * ( CPhysicsConstants.p0 * CPhysicsConstants.temperature_actuelle\n + CPhysicsConstants.p1 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat1\n + CPhysicsConstants.p2 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat2\n + CPhysicsConstants.p3 * CPhysicsConstants.temperature_actuelle - CPhysicsConstants.deltaT_last_century / 100 * CPhysicsConstants.deltat3 );\n */\n\n this.a_calottes = ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_LGM_noinsol ) / ( CPhysicsConstants.temperature_1750 - CPhysicsConstants.temperature_LGM ) * 0.8; // on suppose qu'une partie de la variation du niveau de calotte est lié à l'effet de la température (ici 40%), et l'autre est liée à l'effet de la variation d'insolation.\n this.b_calottes = CPhysicsConstants.niveau_calottes_1750 - this.a_calottes * CPhysicsConstants.temperature_1750;\t \n this.niveau_calottes_actuel = CPhysicsConstants.niveau_calottes_1750 + ( this.a_calottes * CPhysicsConstants.temperature_actuelle + this.b_calottes - CPhysicsConstants.niveau_calottes_1750 ) * ( 1. - Math.exp( - 100. / CPhysicsConstants.tau_niveau_calottes_deglacement ) );\n\tCLogger.log( 'physics-constants: niveau_calottes_actuel= ' + this.niveau_calottes_actuel );\n\t//CLogger.log( 'niveau_calottes_1750,temperature_actuelle,niveau_calottes_1750=' + CPhysicsConstants.niveau_calottes_1750 + CPhysicsConstants.temperature_actuelle + CPhysicsConstants.niveau_calottes_1750);\n\t//CLogger.log ('a_calottes,b_calottes,tau_niveau_calottes_deglacement=' + this.a_calottes + this.b_calottes + CPhysicsConstants.tau_niveau_calottes_deglacement);\n\n // modif CR: 31 oct 2019: Tressentie_act doit correspondre au calcul dans calcul_niveau_mer\n // this.Tressentie_act = CPhysicsConstants.temperature_actuelle - 0.7; // orig -0.75\n\tthis.pond_memoire_mer = Math.exp(-CPhysicsConstants.tmemoire_niveau_mer/CPhysicsConstants.tau_niveau_mer);\n CLogger.log( 'physics-constants: pond_memoire_mer= ' + this.pond_memoire_mer);\n\tCLogger.log( 'pond_memoire_mer=' + this.pond_memoire_mer);\n\tCLogger.log( 'temperature_actuelle=' + CPhysicsConstants.temperature_actuelle);\n\tCLogger.log( 'deltaT_last_century=' + this.deltaT_last_century);\n this.Tressentie_act = CPhysicsConstants.temperature_actuelle - this.pond_memoire_mer * this.deltaT_last_century; // -0.64\n\n this.dilatation_1750 = CPhysicsConstants.dilat * CPhysicsConstants.coef_dilat * ( CPhysicsConstants.temperature_1750 - this.Tressentie_act );\n\tCLogger.log( 'dilatation_1750=' + this.dilatation_1750);\n\tCLogger.log( 'dilat=' + CPhysicsConstants.dilat);\n\tCLogger.log( 'coef_dilat=' + CPhysicsConstants.coef_dilat);\n\tCLogger.log( 'temperature_1750=' + CPhysicsConstants.temperature_1750);\n\tCLogger.log( 'Tressentie_act=' + this.Tressentie_act);\n\n\n // Commenté par Camille le 19 avril 2024 car c'est devenu inutile\n /*\n this.optim1 = ( 1 + this.dilatation_1750 ) * ( 1\n - CPhysicsConstants.fphig2 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 2 )\n - CPhysicsConstants.fphig3 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 3 ) ) \n - ( 1 - CPhysicsConstants.fphig2 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 2 )\n - CPhysicsConstants.fphig3 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 3 ) );\n this.optim2 = ( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max ) - ( 1 + this.dilatation_1750 ) * ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max );\n this.fphig1 = (CPhysicsConstants.niveau_mer_1750_target / CPhysicsConstants.Hmer_tot - this.optim1 ) / this.optim2;\n */\n\n // CR avril 2024: Hmer_tot est maintenant ajusté avec le LGM\n CPhysicsConstants.Hmer_tot =\t(CPhysicsConstants.niveau_mer_LGM+10.0) / ((1.-Math.cos((CPhysicsConstants.niveau_calottes_max-this.niveau_calottes_actuel)*CPhysicsConstants.pi/180)) * Math.pow((1.-this.niveau_calottes_actuel/CPhysicsConstants.niveau_calottes_max),CPhysicsConstants.expmer ) - (1.-Math.cos((CPhysicsConstants.niveau_calottes_max-CPhysicsConstants.niveau_calottes_LGM)*CPhysicsConstants.pi/180)) * Math.pow((1.-CPhysicsConstants.niveau_calottes_LGM/CPhysicsConstants.niveau_calottes_max),CPhysicsConstants.expmer ));\t\n CLogger.log( 'physics-constants: Hmer_tot = ' + CPhysicsConstants.Hmer_tot );\t\n\tCLogger.log( 'physics-constants: niveau_calottes_actuel=' + this.niveau_calottes_actuel);\n\n // CR avril 2024: Hmeract calculé avec la nouvelle formule du niveau mer\n this.Hmeract =\tCPhysicsConstants.Hmer_tot * ( 1. - (1.-Math.cos((CPhysicsConstants.niveau_calottes_max-this.niveau_calottes_actuel)*CPhysicsConstants.pi/180)) * Math.pow((1.-this.niveau_calottes_actuel/CPhysicsConstants.niveau_calottes_max),CPhysicsConstants.expmer ) );\n CLogger.log( 'physics-constants: Hmeract = ' + this.Hmeract );\n \n /*\n this.Hmeract = CPhysicsConstants.Hmer_tot * ( 1\n - this.fphig1 * ( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max)\n - CPhysicsConstants.fphig2 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 2 )\n - CPhysicsConstants.fphig3 * Math.pow( this.niveau_calottes_actuel - CPhysicsConstants.niveau_calottes_max, 3 ) );\n */\n \n // modif CR 4 nov 2019: calcul exact de niveau_mer_1750\n // this.niveau_mer_1750 = CPhysicsConstants.Hmer_tot * ( 1 + CPhysicsConstants.dilat * 0.5 * ( CPhysicsConstants.temperature_1750 - this.Tressentie_act ) ) * ( 1\n // - this.fphig1 * ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max)\n // - CPhysicsConstants.fphig2 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 2 )\n // - CPhysicsConstants.fphig3 * Math.pow( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.niveau_calottes_max, 3 ) ) - this.Hmeract;\n\n // modif CR avril 2024 car on modifie le calcul de niveau mer.\n this.Hmer_1750 = CPhysicsConstants.Hmer_tot * ( 1 + this.dilatation_1750 ) * ( 1. - (1.-Math.cos((CPhysicsConstants.niveau_calottes_max-CPhysicsConstants.niveau_calottes_1750)*CPhysicsConstants.pi/180))* Math.pow((1.-CPhysicsConstants.niveau_calottes_1750/CPhysicsConstants.niveau_calottes_max),CPhysicsConstants.expmer ) ) ;\n CLogger.log( 'physics-constants: Hmer_1750 = ' + this.Hmer_1750 );\n CLogger.log( 'physics-constants: dilatation_1750= ' + this.dilatation_1750);\n CLogger.log( 'physics-constants: Hmer_tot= ' + CPhysicsConstants.Hmer_tot);\n CLogger.log( 'physics-constants: CPhysicsConstants.niveau_calottes_1750 = ' + CPhysicsConstants.niveau_calottes_1750 );\n\t\n this.niveau_mer_1750 = this.Hmer_1750- this.Hmeract;\n CLogger.log( 'physics-constants: niveau_mer_1750 = ' + this.niveau_mer_1750 );\n this.C_alteration_naturel = - CPhysicsConstants.volcanisme_actuel / CPhysicsConstants.concentration_coo_1750;\n this.deltaT_poce = 0.5 / CPhysicsConstants.A_oce;\n this.a_H2O = - CPhysicsConstants.q_H2O * ( 1 - this.G0 );\n this.Tlim_bio_froid = CPhysicsConstants.temperature_froid;\n this.delta_angle_actuel = ( CPhysicsConstants.lat_Mil - CPhysicsConstants.obliquite_actuel) / 360 * 2 * CPhysicsConstants.pi;\n this.insol_actuel = CPhysicsConstants.puissance_recue_zero * Math.cos( this.delta_angle_actuel );\n this.albedo_crit = ( CPhysicsConstants.albedo_1750 - CPhysicsConstants.albedo_ter * ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.phig_crit ) / \n ( CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit ) ) / \n ( 1 - ( CPhysicsConstants.niveau_calottes_1750 - CPhysicsConstants.phig_crit ) / \n ( CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit ) ); // 0.41\n this.albedo_actuel = this.albedo_crit + ( this.niveau_calottes_actuel - CPhysicsConstants.phig_crit ) / ( CPhysicsConstants.niveau_calottes_max - CPhysicsConstants.phig_crit ) * ( CPhysicsConstants.albedo_ter - this.albedo_crit );\n this.stockage_max = CPhysicsConstants.flux_co2_stockage_max / CPhysicsConstants.concentration_coo_1750;\n this.concentration_coo_carbonifere = CPhysicsConstants.concentration_coo_1750 * 2; // modif 7 avril 2009\n this.stockage_carbonifere = CPhysicsConstants.flux_co2_stockage_carbonifere / this.concentration_coo_carbonifere;\n }\n\n\n /**\n * logModelConstants method. \n * \n * this method simply log to the console class properties and methods.\n *\n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n *\n * @beta\n */\n\n public logModelConstants(): void {\n console.log( this );\n }\n\n \n /**\n * toJSON method. \n * \n * this method return the public and protected object properties.\n *\n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n *\n * @beta\n */\n\n public toJSON(): Object {\n let properties = Object.getOwnPropertyNames( this );\n return properties;\n }\n}\n","import { CPhysicsConstants } from './simclimat-lib.physics-constants';\n\nexport const enum graphTypes {\n TEMPERATURE,\n WATERLEVEL,\n CALOTTESLEVEL,\n CONCENTRATION_CO2,\n EMISSIONS_CO2,\n ALBEDO\n}\n\n\nexport interface IModelVars {\n\n\tenable_gl_animations: number;\n\techeance_min: number;\n\techeance_max: number;\n\techeance_reset_value: number;\n\ttime_slider_reset_value: number;\n\n\t/** initialisation des combo-boxes */\n\n graphe_one_init: graphTypes;\n\tgraphe_two_init: graphTypes;\n\tgraphe_three_init: graphTypes;\n\tgraphe_four_init: graphTypes;\n\n\t/** type de simulation (simulation_type-dialog) */\n\tfixed_concentration_reset_value: number;\n\n\t/** concentration en CO2: utilisé dans concentration_dialog */\n\tcoo_concentr_terre_initiale: number;\n\tcoo_concentr_cretace: number;\n\tcoo_concentr_1750: number;\n\tcoo_concentr_today: number;\n\tcoo_concentr_min: number;\n\tcoo_concentr_max: number;\n\tcoo_concentr_reset_value: number;\n\n\t/** emission: utilisées dans emission_dialog */\n\temit_anthro_coo_nul: number;\n\temit_anthro_coo_actuel: number;\n\temit_anthro_coo_2xactuel: number;\n\temit_anthro_coo_min: number;\n\temit_anthro_coo_max: number;\n\temit_anthro_coo_reset_value: number;\n\n\tvolcan_terre_init: number;\n\tvolcan_actuel: number;\n\tvolcan_min: number;\n\tvolcan_max: number;\n\tvolcan_reset_value: number;\n\n\talteration_actuel: number;\n\talteration_min: number;\n\talteration_max: number;\n\talteration_reset_value: number;\n\n\tstockage_biologique_actuel: number;\n\tstockage_biologique_carbonifere: number;\n\tstockage_biologique_min: number;\n\tstockage_biologique_max: number;\n\tstockage_biologique_reset_value: number;\n\n\t/** retroactions climatiques (retroactions_dialog) */\n\t/** 1) albedo: */\n\tfixed_albedo_reset_value: number;\n\talbedo_act: number;\n\talbedo_glace: number;\n\talbedo_terre: number;\n\talbedo_min: number;\n\talbedo_max: number;\n\talbedo_reset_value: number;\n\n\t/** 2) ocean */\n\tfixed_ocean_reset_value: number;\n\tdebranche_ocean_reset_value: number;\n\tpuit_ocean_actuel: number;\n\tpuit_ocean_min: number;\n\tpuit_ocean_max: number;\n\tpuit_ocean_reset_value: number;\n\n\t/** 3) vegetation */\n\tdebranche_biologie_reset_value: number;\n\tpuit_bio_actuel: number;\n\tpuit_bio_min: number;\n\tpuit_bio_max: number;\n\tpuit_bio_reset_value: number;\n\n\t/** 4) vapeur d'eau */\n\tfixed_eau_reset_value: number;\n\trapport_H2O_actuel: number;\n\trapport_H2O_min: number;\n\trapport_H2O_max: number;\n\trapport_H2O_reset_value: number;\n\n\t/** param astro (parametres_astronomique_dialog) */\n\t/** 1) distance */\n\tdistance_ts_actuel: number;\n\tdistance_ts_min: number;\n\tdistance_ts_max: number;\n distance_ts_reset_value: number;\n \n\t/** 2) puissance */\n\tpuissance_soleil_terre_init: number;\n\tpuissance_soleil_actuel: number;\n\tpuissance_soleil_min: number;\n\tpuissance_soleil_max: number;\n\tpuissance_soleil_reset_value: number;\t\n \n /** 3) excentricite */\n\texcentricite_act: number;\n\texcentricite_valeur_min: number;\n\texcentricite_valeur_max: number;\n\texcentricite_autre_min: number;\n\texcentricite_autre_max: number;\n\texcentricite_reset_value: number;\n \n /** 4) obliquite */\n\tobliquite_act: number;\n\tobliquite_valeur_min: number;\n\tobliquite_valeur_max: number;\n\tobliquite_autre_min: number;\n\tobliquite_autre_max: number;\n\tobliquite_reset_value: number;\n \n /** 5) precession */\n\tprecession_act: number;\n\tprecession_valeur_min: number;\n\tprecession_valeur_max: number;\n\tprecession_autre_min: number;\n\tprecession_autre_max: number;\n\tprecession_reset_value: number;\n\n}\n\n\nexport const modelVarsConstants : IModelVars = {\n\n enable_gl_animations : 0, /** 0 si pas d'animation, 1 si animation */\n echeance_min : 100, /** en année */\n echeance_max : 10e6, /** en année */\n echeance_reset_value : 500, /** en année */\n time_slider_reset_value : 0, /** en %age de l'échéance */\n\n /** affichage des results */\n\n graphe_one_init: graphTypes.TEMPERATURE,\n graphe_two_init: graphTypes.CONCENTRATION_CO2,\n graphe_three_init: graphTypes.WATERLEVEL,\n graphe_four_init: graphTypes.CALOTTESLEVEL,\n\n\n /** simulation_type */\n fixed_concentration_reset_value : 1,\n\n /** concentrations en CO2 en ppm */\n coo_concentr_terre_initiale : 0.3e6,\n coo_concentr_cretace : 1500,\n coo_concentr_1750 : CPhysicsConstants.concentration_coo_1750,\n coo_concentr_today : CPhysicsConstants.concentration_coo_actuel,\n coo_concentr_min : 0,\n coo_concentr_max : 1e6,\n coo_concentr_reset_value : 0,\n\n /** emissions de CO2, en Gt/an. */\n /** emissions antropiques */\n emit_anthro_coo_actuel : CPhysicsConstants.emit_anthro_coo_act, /** en GT */\n emit_anthro_coo_2xactuel : CPhysicsConstants.emit_anthro_coo_act * 2,\n emit_anthro_coo_nul : 0.,\n emit_anthro_coo_min : -2,\n emit_anthro_coo_max : 50,\n emit_anthro_coo_reset_value : 0,\n\n /** volcanisme */\n volcan_actuel : CPhysicsConstants.volcanisme_actuel, /** volcanisme continental? 0.083 */\n volcan_terre_init : 0,\n /** d'après les flux de chaleurs en fonction du temps depuis formation de la terre données sur www.geo.mtu.edu/svl/GE3320/LECTURE%206.ppt */\n /** volcan_terre_600ma=volcan_actuel*2; // d'après la même source */\n volcan_min : 0,\n volcan_max : 0,\n volcan_reset_value : 0,\n\n /** alteration, en % de variation par rapport à la ref=C_alteration_naturel */\n alteration_actuel : 100., /** en Gt/an: transport par fleuves: 0.4 */\n alteration_min : 0.0,\n alteration_max : 1000.0, /** altération 10x plus forte */\n alteration_reset_value : 0,\n\n /** stockage biologique */\n stockage_biologique_actuel : 0.,\n stockage_biologique_carbonifere : 0, /** en Mt/an/ppm */\n stockage_biologique_min : 0.,\n stockage_biologique_max : 0, /** en Mt/an/ppm */\n stockage_biologique_reset_value : 0.,\n\n /** albédo */\n fixed_albedo_reset_value : 0,\n albedo_act : 0,\n albedo_reset_value : 0,\n albedo_glace : CPhysicsConstants.albedo_glace_const * 100,\n albedo_terre : CPhysicsConstants.albedo_ter * 100,\n albedo_min : 0.,\n albedo_max : 100.,\n\n /** puit biologique */\n debranche_biologie_reset_value : 0,\n puit_bio_actuel : CPhysicsConstants.puit_bio_act, /** en fraction de l'excédent humain (emissions +deforest) absorbé */\n puit_bio_min : -50,\n puit_bio_max : 100.,\n puit_bio_reset_value : 0,\n\n /** puit océanique */\n fixed_ocean_reset_value : 1,\n debranche_ocean_reset_value : 0,\n puit_ocean_actuel : CPhysicsConstants.puit_ocean_act, /** en fraction de l'excédent humain (emissions +deforest) absorbé */\n puit_ocean_min : -50,\n puit_ocean_max : 100.,\n puit_ocean_reset_value : 0,\n\n /** vapeur d'eau */\n fixed_eau_reset_value : 0,\n rapport_H2O_reset_value : 100., /** H20(t)/H20_actuel */\n rapport_H2O_actuel : 100. * CPhysicsConstants.rapport_H2O_actconst,\n rapport_H2O_min : 0.,\n rapport_H2O_max : 1000.,\n\n /** parametres orbitaux */\n /** en fraction d'augmentation par rapport à l'actuel, en % */\n puissance_soleil_terre_init : 70, // modif le 8 avril: -30% d'emission->70%\n puissance_soleil_actuel : 100,\n puissance_soleil_min : 0,\n puissance_soleil_max : 1000,\n puissance_soleil_reset_value : 0,\n distance_ts_actuel : 100, /** en fraction d'augmentation par rapport à l'actuel */\n distance_ts_min : 0,\n distance_ts_max : 1000,\n distance_ts_reset_value : 0,\n\n /** paramètres orbitaux */\n excentricite_act : CPhysicsConstants.excentricite_actuel, /** en fraction */\n excentricite_reset_value : 0, /** en fraction */\n excentricite_valeur_min : 0.,\n excentricite_valeur_max : 0.06,\n excentricite_autre_min : 0.,\n excentricite_autre_max : 0.2,\n\n obliquite_act : CPhysicsConstants.obliquite_actuel, /** en degrès */\n obliquite_reset_value : 0, /** en degrès */\n obliquite_valeur_min : 21.8,\n obliquite_valeur_max : 24.4,\n obliquite_autre_min : 0.,\n obliquite_autre_max : 90.,\n\n precession_act : CPhysicsConstants.precession_actuel, /** en degrès */ \n precession_reset_value : 0, /** en degrès */\n /** 31 janv 2009: on met les min et max à -90 et 90 respectivement, au lieu de -180 et 180, car c'est avec -90 et 90 qu'on a les écarts de température les plus fort. */\n precession_valeur_min : 90,\n precession_valeur_max : 270,\n precession_autre_min : 0,\n precession_autre_max : 360\n};\n\nexport class CModelVars {\n public modelConstants: IModelVars;\n\n constructor( modelConstants?: IModelVars ) {\n /** Merge default constants values with constructor passed values into private modelConstants property. */\n if ( modelConstants == undefined )\n {\n this.modelConstants = { ...modelVarsConstants };\n }\n else\n {\n this.modelConstants = { ...modelVarsConstants, ...modelConstants };\n }\n\n /** Instantiate a CPhysicsConstants object */\n let physicConstants = new CPhysicsConstants();\n\n // Set reset vars + some others\n this.modelConstants.precession_reset_value = this.modelConstants.precession_act;\n this.modelConstants.obliquite_reset_value = this.modelConstants.obliquite_act;\n this.modelConstants.excentricite_reset_value = this.modelConstants.excentricite_act;\n this.modelConstants.distance_ts_reset_value = this.modelConstants.distance_ts_actuel;\n this.modelConstants.puissance_soleil_reset_value = this.modelConstants.puissance_soleil_actuel;\n this.modelConstants.puit_ocean_reset_value = this.modelConstants.puit_ocean_actuel;\n this.modelConstants.puit_bio_reset_value = this.modelConstants.puit_bio_actuel;\n this.modelConstants.albedo_reset_value = physicConstants.albedo_actuel * 100;\n this.modelConstants.albedo_act = physicConstants.albedo_actuel * 100;\n this.modelConstants.stockage_biologique_max = - physicConstants.stockage_max * 1e3;\n this.modelConstants.stockage_biologique_carbonifere = - physicConstants.stockage_carbonifere * 1e3;\n this.modelConstants.alteration_reset_value = this.modelConstants.alteration_actuel;\n this.modelConstants.volcan_reset_value = this.modelConstants.volcan_actuel;\n this.modelConstants.volcan_terre_init = this.modelConstants.volcan_actuel * 5;\n this.modelConstants.volcan_max = this.modelConstants.volcan_terre_init * 6;\n this.modelConstants.emit_anthro_coo_reset_value = this.modelConstants.emit_anthro_coo_nul;\n this.modelConstants.coo_concentr_reset_value = this.modelConstants.coo_concentr_1750;\n\n }\n\n logModelConstants(): void {\n console.log( this.modelConstants );\n }\n}\n\n","import {CLogger} from './simclimat-lib.logger';\nimport {CModelVars, IModelVars} from './simclimat-lib.model-vars';\nimport {CPhysicsConstants} from './simclimat-lib.physics-constants';\nimport {CSimulationValues} from './simclimat-lib.simulation-values';\nimport {CExperienceValues} from './simclimat-lib.experience-values';\n\n\n/**\n * This class calculate climat simulation model.\n *\n * Instanciation example : \n * \n * ```typescript\n * const instance = new CModel();\n * ```\n * \n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n * \n * @author Alain Deseine\n * \n * @copyright CEI Alain Deseine 1992-2019\n * \n * @beta \n */\n\nexport class CModel {\n private modelPhysicsConstants: CPhysicsConstants;\n private modelConstants: IModelVars;\n private simulationValues: CSimulationValues; // TODO Alain changer le type\n private experienceValues: CExperienceValues; // TODO Alain Changer le type\n\n\n /**\n * Constructor. \n * \n * The constructor of this class initialise Physics constants and model vars.\n *\n * @remarks\n * This method is part of the {@link core-library#Statistics | Statistics subsystem}.\n *\n * @beta\n */\n\n constructor( modelConstants?: IModelVars ) {\n // Instanciate a CModelVars object\n let modelVars: CModelVars;\n\n if ( modelConstants == undefined )\n {\n modelVars = new CModelVars();\n }\n else\n {\n modelVars = new CModelVars( modelConstants );\n }\n\n // Merge default constants values with constructor passed values into private modelConstants property.\n this.modelConstants = { ...modelVars.modelConstants };\n\n // Instanciate a CPhysicsConstants object\n this.modelPhysicsConstants = new CPhysicsConstants();\n } // eo constructor\n\n\n public logModelConstants(): void {\n console.log( this.modelPhysicsConstants );\n console.log( this.modelConstants );\n } // eo logModelConstants method\n\n \n /**\n * Utils methods\n */\n\n \n public calculT( Teq: number, Tprec: number, tau: number, dt: number ): number {\n\t let T: number;\n T = Tprec + ( Teq - Tprec ) * ( 1 - Math.exp( - dt / tau ) );\n \n\t return T;\n\t} // eo calculT method\n\n \n public calcul_forcage_serre_H2O( zrapport_H2O: number ): number {\n let forcage_serre_H2O: number;\n \n CLogger.log( 'Method calcul_forcage_serre_H2O: zrapport_H2O = ' + zrapport_H2O );\n \n if ( zrapport_H2O > 1e-5 )\n { \t\t\n // forcage_serre_H2O=a_H2O*(1-exp(pow_H2O*log(zrapport_H2O)));\n // modif le 7 avril pour éviter rétroactions trop positives\n // on sature le forcage serre aux hautes concentrations en eau\n // forcage_serre_H2O = this.modelPhysicsConstants.a_H2O * ( 1 - Math.exp( CPhysicsConstants.pow_H2O * Math.log( zrapport_H2O ) ) );\n forcage_serre_H2O = this.modelPhysicsConstants.a_H2O * ( 1 - Math.exp( CPhysicsConstants.pow_H2O * Math.log( zrapport_H2O ) ) ) * ( 0.3 * Math.exp( - Math.sqrt( Math.abs( zrapport_H2O - 1 ) ) / 10.0 ) + 0.7 );\n\t }\n else\n {\n\t\t forcage_serre_H2O = this.modelPhysicsConstants.a_H2O;\n }\n\n CLogger.log( 'Method calcul_forcage_serre_H2O: forcage_serre_H2O = ' + forcage_serre_H2O );\n \n\t return forcage_serre_H2O;\n\t} // eo calcul_forcage_serre_H2O method\n\n\n public calcul_forcage_serre_CO2( zCO2:number ): number {\n\n let forcage_serre_CO2: number;\n \n if ( zCO2 < CPhysicsConstants.concentration_coo_limite_bas )\n {\n CLogger.log( 'Method calcul_forcage_serre_CO2: relation linéaire, extrapolation basse' );\n // forcage_serre_CO2 = - 0.2 * this.modelPhysicsConstants.G0 + zCO2 / CPhysicsConstants.concentration_coo_limite_bas * ( 0.2 * this.modelPhysicsConstants.G0 + CPhysicsConstants.a_coo * Math.log( CPhysicsConstants.concentration_coo_limite_bas / CPhysicsConstants.concentration_coo_1750 ) );\n forcage_serre_CO2 = - CPhysicsConstants.q_CO2 * this.modelPhysicsConstants.G0 + zCO2 / CPhysicsConstants.concentration_coo_limite_bas * ( CPhysicsConstants.q_CO2 * this.modelPhysicsConstants.G0 + CPhysicsConstants.a_coo * Math.log( CPhysicsConstants.concentration_coo_limite_bas / CPhysicsConstants.concentration_coo_1750 ) );\n }\n else if ( zCO2 > CPhysicsConstants.concentration_coo_limite )\n {\n CLogger.log( 'Method calcul_forcage_serre_CO2: relation linéaire, extrapolation haute' );\n // forcage_serre_CO2 = CPhysicsConstants.a_coo * ( Math.log( CPhysicsConstants.concentration_coo_limite / CPhysicsConstants.concentration_coo_1750 ) + zCO2 / CPhysicsConstants.concentration_coo_limite - 1 );\n forcage_serre_CO2 = CPhysicsConstants.a_coo * ( Math.log( CPhysicsConstants.concentration_coo_limite / CPhysicsConstants.concentration_coo_1750 ) + 1.0 * ( zCO2 / CPhysicsConstants.concentration_coo_limite - 1 ) );\n }\n else\n {\n // relation log\n CLogger.log( 'Method calcul_forcage_serre_CO2: relation log' );\n forcage_serre_CO2 = CPhysicsConstants.a_coo * Math.log( zCO2 / CPhysicsConstants.concentration_coo_1750 );\n }\n \n CLogger.log( 'Method calcul_forcage_serre_CO2: forcage_serre_CO2 = ' + forcage_serre_CO2 );\n\n return forcage_serre_CO2;\n } // eo calcul_forcage_serre_CO2 method\n \n\n public calcul_phieq( zT: number, insol65N: number ): number {\n \n\t let zphieq: number;\n\t // T en degre K\n \n CLogger.log( 'Method calcul_phieq: calcul_phig = ' + zT );\n CLogger.log( 'Method calcul_phieq: calcul_phig: a_calottes = ' + this.modelPhysicsConstants.a_calottes );\n CLogger.log( 'Method calcul_phieq: calcul_phig: b_calottes = ' + this.modelPhysicsConstants.b_calottes );\n \n // zphieq = this.modelPhysicsConstants.a_calottes * ( zT - 273.0 ) + this.modelPhysicsConstants.b_calottes + CPhysicsConstants.c_calottes * ( insol65N - this.modelPhysicsConstants.insol_actuel );\n zphieq = this.modelPhysicsConstants.a_calottes * ( zT - CPhysicsConstants.Tkelvin ) + this.modelPhysicsConstants.b_calottes + CPhysicsConstants.c_calottes * ( insol65N - this.modelPhysicsConstants.insol_actuel );\n \n if ( zphieq > CPhysicsConstants.niveau_calottes_max )\n {\n\t\t zphieq = CPhysicsConstants.niveau_calottes_max;\n }\n \n if ( zphieq < CPhysicsConstants.niveau_calottes_min )\n {\n\t\t zphieq = CPhysicsConstants.niveau_calottes_min;\n\t }\n\n CLogger.log( 'Method calcul_phieq: calcul_phig: a_calottes * ( zT - CPhysicsConstants.Tkelvin ) = ' + this.modelPhysicsConstants.a_calottes * ( zT - CPhysicsConstants.Tkelvin ) );\n CLogger.log( 'Method calcul_phieq: calcul_phig: c_calottes * ( insol65N - insol_actuel ) = ' + CPhysicsConstants.c_calottes * ( insol65N - this.modelPhysicsConstants.insol_actuel ) );\n CLogger.log( 'Method calcul_phieq: calcul_phig: zphieq = ' + zphieq );\n\n\t return zphieq;\n\t} // eo calcul_phieq method\n\n\n\tpublic calcul_tau_niveau_calottes( phieq: number, zphig_ancien: number ) {\n\n let tau_niveau_calottes: number;\n \n if ( zphig_ancien < phieq )\n {\n CLogger.log( 'Method calcul_tau_niveau_calottes: désenglacement' );\n tau_niveau_calottes = CPhysicsConstants.tau_niveau_calottes_deglacement;\n\t }\n else\n {\n CLogger.log( 'Method calcul_tau_niveau_calottes: englacement' );\n tau_niveau_calottes = CPhysicsConstants.tau_niveau_calottes_englacement;\n }\n \n CLogger.log( 'Method calcul_tau_niveau_calottes: calcul_phig: tau_niveau_calottes = ' + tau_niveau_calottes );\n\n return tau_niveau_calottes;\n\t} // eo calcul_tau_niveau_calottes method\n\n \n /*\n public calcul_niveau_mer_old( zphig: number, zT: number, t: number ): number {\n\n\t // let sv: any = this.experienceValues.back(); // TODO Alain : Revenir la dessus\n\t let niveau_mer: number;\n let Tressentie: number;\n \n\t // modif le 30 jan 2011: tau_niveau_mer est en année, il faut diviser par temps_elem pour l'avoir en nombre de pas\n // let index: number = Math.max( this.experienceValues.indice_min(), t - Math.trunc( CPhysicsConstants.tau_niveau_mer ) ); \n // let index: number = Math.max( this.experienceValues.indice_min(), t - Math.trunc( CPhysicsConstants.tau_niveau_mer / this.experienceValues.temps_elem() ) );\n // modif CR: 31 oct 2019: index doit pouvoir être soit positif, soit négatif. On met juste des bornes entre -100 et +100\n let index: number = t - Math.trunc( CPhysicsConstants.tau_niveau_mer / this.experienceValues.temps_elem() );\n index = Math.min( this.experienceValues.indice_max()