Table des matières
Thermique du sol
Les méthodes décrites ici, ne sont pas absolument nécessaire pour l'estimation du risque. C'est pour cela qu'elles ne sont pas intégrées dans le flow-chart initial. Elles peuvent toutefois donner des informations supplémentaires.
Surface du sol (BTS)
Principe de base
La mesure consiste à déterminer la température à l'interface sol-fond du manteau neigeux à la fin de l'hiver, mais avant la fonte. Il est supposé que si les température à l'interface sont nettement négative (< -3°C) on se trouve potentiellement sur le permafrost
Implémentation
- But : Obtenir une image de la répartition thermique en surface
- Quand : en mars, avant la fonte
- Résultat : points X;Y avec température
- Prérequis : défintion de l'AOI
Spécifications techniques
- un thermomètre DIGITEK (DP1-DP1H) avec un capteur RTD PT100 (résolution de 0,1°C)
- un capteur GNSS
Exploitation des données
- Une fois géoréférencées, les données peuvent être spatialisée
- Nous avons utilisé une interpolation de type krigeage afin d'obtenir une répartition spatiale aussi bien qu'un niveau de qualité de l'interpolation.
Forces et faiblesses
Forces | Faiblesses |
---|---|
Réalisation facile | Interprétation ne suit pas les hypothèses de base dans notre cas |
Difficultés et écueils
Lors de l'acquisition et du traitement des données BTS, nous avions déjà les informations de la géophysique et des forages. En explorant les données acquises il ressort qu'environ 25% des données seraient liée à du permafrost alors que 50% ne le serais pas. Pourtant la connaissance qu'on avait du sous-sol montre que certains points BTS en principe non relié à du permafrost se trouvent sur des zones au sous-sol fortement englacé.
Figure 7.1 distribution des températures observées
De ces mesures on peut connaitre les zones où la surface est froide, ce qui peut avoir un impact lors de la fonte du manteau neigeux par exemple.
Dans un environnement comme le “Glacier” Bonnard, où la couche superficielle composée de gros blocs est relativement aérée, nous avons l'impression que la mesure BTS est plutôt corrélée avec l'épaisseur de cette couche (distance au permafrost).
Figure 7.2 Température de la suface du sol
Température en profondeur
Principe de base
Mesure de la température dans un forge à plusieurs hauteurs.
Implémentation
- But : Connaitre la profondeur du front de gel
- Quand : Suite au forage
- Résultat : Diagramme de Hovmöller temps/profondeur/température
- Prérequis : forage
Spécifications techniques
- une chaine de thermistore Geoprecision soit :
- mini-dataloggers M-Log5W
- senseur T6NODE composé d'un cspteur en platine de haute précision PT1000 avec une résolution de 0.01°C et calibré à ±0.1°C.
Exploitation des données
- Unelation.
Figure 7.3 Evolution du point isotherme journalier sur la période 2010-2011
- Renommer le fichier de données brutes en « Brut.txt » (attention case sensitive). Le fichiers doivent être dans le même dossier que les programmes python.
- Ouvrir le fichier et le nettoyer :
- Supprimer les premières lignes, jusqu’à la première série de 4 mesures pour un même jour (en l’occurrence le 12 août 2010)
- Parcourir le fichier et supprimer les éventuelles lignes erronées et les lignes dont l’heure ne correspond pas à 00:00, 06:00, 12:00 ou 18:00 (généralement immédiatement avant ou après le message d’erreur)
- Remplacer les valeurs (NO REPLY) par un nombre à virgule flottante ou entier (999)
- Lancer le programme python « format_data.py »
- Vérifier le fichier final créé : « Brut_corrected.txt »
- Lancer le programme python « isotherm.py »
- Vérifier le fichier final créé : « results.txt »
- format_data.py
import re # Fonction pour calculer l'intervalle entre chaque profondeur def computeNbEtape (intervalle, valeur1, valeur2): return (valeur1 - valeur2) / intervalle # Fonction pour incrementer de nouvelles profondeurs def AjouterEtapes (ligneorigin, IntervalleCalc, nbEtape, valeurBase): for mesTicks in range(1, int(nbEtape)): maTempCalculee = valeurBase - mesTicks * IntervalleCalc ligneorigin.append(maTempCalculee) # Fonction pour extrapoler les temperatures manquantes par intervalle de 5cm def genereTemperature(lignetemperature, profondeurs, intervalle): mesTempResults = [] for index, temp in enumerate(lignetemperature): mesTempResults.append(temp) if index < (len(lignetemperature)-1): nbEtape = computeNbEtape(intervalle/100.0, profondeurs[index], profondeurs[index+1]) maDiffTemp = (lignetemperature[index] - lignetemperature[index+1]) AjouterEtapes(mesTempResults, maDiffTemp/nbEtape, nbEtape, lignetemperature[index]) return mesTempResults if __name__ == '__main__': # Recuperation des parametres # profondeurs en m profondeurs = [-0.25,-0.5,-1,-1.5,-2.5,-3.5,-4.5,-5.5,-6.5] espacement = input ("Entrer l'espacement desire (en cm) ") espacement = int(espacement) # Transformation de "espacement" en nombre entier fichierBrut = "D:\data\myfile\raw.txt" fichierEcrire = fichierBrut[:-4] + "_corrected" + ".txt" # Renommer le fichier en appondant '_corrected' # Ouverture et lecture des fichiers (source et destination) fichierLire = open(fichierBrut) mesLignes = fichierLire.readlines() fichierFinal = open(fichierEcrire, 'w') fichierFinal.write ("Fichier genere par format_data.py pour la mise en forme des donnees de temperature\n") # Calcul et ecriture des profondeurs incrementees mesprofgenerees = [] for index, maprofondeur in enumerate(profondeurs): mesprofgenerees.append(maprofondeur) if index < (len(profondeurs)-1): nbEtape = computeNbEtape(espacement/100.0, profondeurs[index], profondeurs[index+1]) maDiffProf = profondeurs[index] - profondeurs[index+1] AjouterEtapes(mesprofgenerees, maDiffProf / nbEtape, nbEtape, profondeurs[index]) fichierFinal.write("ID\t DATE HEURE\t") fichierFinal.write("\t".join(map(str, mesprofgenerees)) + "\n") print("Nombre de colonnes de base, ajoutees, total: {}, {}, {}".format(len(profondeurs), len(mesprofgenerees) + 2 - len(profondeurs), len(mesprofgenerees) + 2)) # Calcul et ecriture des temperatures incrementees for index,ligne in enumerate(mesLignes): #print ("Ligne: ", index, ligne) splitter = re.compile (r'\t') myligneitems = splitter.split(ligne) myTemperatureLigne = myligneitems[4:-6] # Les valeurs de temperatures commencent a l'index 2 myTemperatureLigne[:] = map(float, myTemperatureLigne) if (len(myTemperatureLigne) != len(profondeurs)): print ("Erreur: nombre de temperatures par ligne different de nombre de profondeurs! ({} / {})".format(len(myTemperatureLigne), len(profondeurs))) exit() malignegeneree = genereTemperature(myTemperatureLigne, profondeurs, espacement) fichierFinal.write("\t".join(myligneitems[:2]) + "\t") fichierFinal.write("\t".join(map(str,malignegeneree)) + "\n") print (len(mesLignes), "Lignes Traitees!") print ("Resultat stocke dans :", fichierEcrire) fichierLire.close() fichierFinal.close()
- isotherm.py
def GetColumn(ligne, colnumber): myarray = ligne.split("\t") return str(myarray[colnumber]) def GetDateFromDateTime (datetime): return datetime[:10] def DoTempMatch (temp1, temp2, temp3, temp4, tolerence): tmin = abs(temp1) - tolerence tmax = abs(temp1) + tolerence if (abs(temp2) > tmax or abs(temp2) < tmin): return False if (abs(temp3) > tmax or abs(temp3) < tmin): return False if (abs(temp4) > tmax or abs(temp4) < tmin): return False return True # Automatisation de fichiers de donnees brutes # # Recherche du point a partir duquel la temperature ne varie plus # Recuperation des donnees # Fichier avec incrementation de profondeurs tous les 5cm fichierBase = 'D:\data\myfile\raw_corrected.txt' fichierBaseDestination = 'D:\data\myfile\Results.txt' # Marge acceptable de variation de temperatures pour chaque jour tolerance = input('Entrez la tolerance en degres Celsius: ') tolerance = float(tolerance) # Transformation de la tolerance en nombre a virgule flottante nomIsothermeFinal = 'Fichier_final.txt' # Ouverture lecture fermeture du fichier (source) fichierIsotherme = open(fichierBase) lignes = fichierIsotherme.readlines() fichierIsotherme.close() enteteProfondeur = lignes[1] lignesdonnees = lignes[2:] print ("Nombre de lignes totales", len(lignesdonnees)) #verification des donnees index = 0; while (1): myDateTime1 = GetDateFromDateTime( GetColumn(lignesdonnees[index],1)) myDateTime2 = GetDateFromDateTime( GetColumn(lignesdonnees[index+1],1)) myDateTime3 = GetDateFromDateTime( GetColumn(lignesdonnees[index+2],1)) myDateTime4 = GetDateFromDateTime( GetColumn(lignesdonnees[index+3],1)) if (myDateTime1 != myDateTime2 or myDateTime1 != myDateTime3 or myDateTime1 != myDateTime4): print ("Erreur avec les dates... Tabouret verifie ton fichier!!!! a la ligne {} date: {}".format(index, myDateTime1)) break index = index + 4 if (index + 3 >= len(lignesdonnees)): break if ((len(lignesdonnees) % 4) != 0 ): print ("Erreur nombre de lignes pas divisible par 4") exit() # processing nombretours = len(lignesdonnees) / 4 print ("Nombre de jours:", nombretours) # Ouverture du fichier (destination) fichierDestination = open(fichierBaseDestination, 'w') fichierDestination.write ('Fichier genere par search_point.py pour trouver le point isotherme\n') fichierDestination.write ('INDEX\tDATE\tCOLONNE\tPROFONDEUR\tTEMPERATURE\n') index = 0 YoupiTrouve = 0 BouhPasTrouve = 0 while ( index < len(lignesdonnees)): # recuperer nombre de colonnes nbcol = len(lignesdonnees[index].split("\t")) if (index == 0): print ("nombre de colonnes:", nbcol) colindex = 2 trouvetempmatch = False while (colindex < nbcol): myCol1 = float(GetColumn(lignesdonnees[index], colindex)) myCol2 = float(GetColumn(lignesdonnees[index+1], colindex)) myCol3 = float(GetColumn(lignesdonnees[index+2], colindex)) myCol4 = float(GetColumn(lignesdonnees[index+3], colindex)) colindex = colindex + 1 if (DoTempMatch(myCol1, myCol2, myCol3, myCol4, tolerance) == True and myCol1 < 30): #print ("Youpi...{} temperature match at column {}, profondeur: {}, temperature: {}".format(index,colindex, GetColumn(enteteProfondeur, colindex), myCol1)) fichierDestination.write ("{}\t{}\t{}\t{}\t{}\n".format(index, GetDateFromDateTime( GetColumn(lignesdonnees[index],1)), colindex, GetColumn(enteteProfondeur, colindex), myCol1)) YoupiTrouve = YoupiTrouve + 1 trouvetempmatch = True break if (trouvetempmatch == False): #print ("Bouhhh... pas trouve snif snif") fichierDestination.write ("{}\t{}\n".format(index, GetDateFromDateTime( GetColumn(lignesdonnees[index],1)))) BouhPasTrouve = BouhPasTrouve + 1 index = index + 4 fichierDestination.close() #isothermeFinal = open(nomIsothermeFinal, 'w') #isothermeFinal.write ('Fichier genere par search_point.py pour trouver le point isotherme') print ("{} Temperatures trouvees, {} Temperatures non trouvees".format(YoupiTrouve, BouhPasTrouve)) #print (len(lignesdonnees) % 4) # Calcul du point isotherme par jour # Recherche de la profondeur a laquelle la temperature ne varie plus (+- la tolerance) #for index in range(len(lignesdonnees) / 4): # if (index == 1): # print (ligne) #for day in ligne.readlines(0,4): # print day #day.close() # while ligne < 5: # ligne = ligne + 1 # if (ligne[0] == ligne[1] +- tolerance): # print (index[profondeurs]) # print ('la profondeur charniere est', ) # isothermeFinal.write(','.join(profondeurs) + ',') #isothermeFinal.close()
Forces et faiblesses
Forces | Faiblesses |
---|---|
Réalisation facile | Interprétation ne suit pas les hypothèses de base dans notre cas |
Difficultés et écueils
La chaîne de température doit être fixée à une référence en surface. Toutefois cette référence doit pouvoir être déplacée car du fait du tassement de la masse glacée les tubes de forage ont tendances à “ressortir” du terrain faussant la mesure des capteurs les plus proche de la surface. De même du fait des cisaillement, il est approprié de prendre des chaine de thermistors pas trop longue (~5-6 m) sous peine de perdre des capteurs.