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


  1. 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.
  2. 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)
  3. Lancer le programme python « format_data.py »
  4. Vérifier le fichier final créé : « Brut_corrected.txt »
  5. Lancer le programme python « isotherm.py »
  6. 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.

temperature.txt · Dernière modification: 2014/09/09 17:20 (modification externe)
Recent changes RSS feed Creative Commons License Donate Minima Template by Wikidesign Driven by DokuWiki