Script para dibujar puntos de perfil en gmsh

No sé programar más que lo que he aprendido a marchas forzadas, por necesidad. En esas situaciones he descubierto lo potente que es un simple programa para ejecutar tareas tediosas o repetitivas. No sé si conocéis Gmsh, una herramienta de mallado que permite crear mallas muy controladas, la “única” pega es que hay que dibujar la geometría punto por punto, línea por línea, etc. Ya entraré a hablar de él más adelante. El caso es que Gmsh lee unos ficheros de extensión .geo que no son más que archivos de texto que contienen la geometría dada de una cierta forma, la de un punto sería la que sigue:

Point(numero_de_punto) = {x,y,z,p};

Donde p es un parámetro que a grandes rasgos da información sobre lo fina que será la malla alrededor del punto.

Como me tira esto del CFD, he querido probar gmsh creando la geometría para una simulación de un ala finita. En internet encuentras applets que generan un fichero con las coordenadas x y de un perfil, te los bajas en un archivo de texto y cuando los abres ves algo como lo que sigue…
  1,000000   -0,000000
  0,960400    0,008787
  0,921600    0,016893
  0,883600    0,024359
  0,846400    0,031222
  0,810000    0,037516
  0,774400    0,043270
                                                     ….              ….

Podéis imaginar lo tedioso que puede resultar cambiar el formato para que gmsh pueda reconocerlo como suyo, aquí es donde entra el script (perdonadme las faltas, no soy programador, sólo trato de que funcione)
Nota; el programa solo hace uso del módulo string, que viene con python, así que si queréis usarlo no tenéis más que instalar python.

#! /usr/bin/env python

import string as s

print “Introduzca el numero de puntos”

numeropuntos = int(raw_input())

print “Introducza la distancia en la direccion z”

distz = float(raw_input())

print “Introduzca la longitud caracteristica del punto”

lc = float(raw_input())



        #########################################
        #         DEFINICION DE FUNCIONES                                                     #
        #########################################

def copiadocumento(archivoviejo, archivonuevo):

#______________________________________________________________________________________________
    def qe(cadena): #funcion para quitar los espacios al principio de la cadena
        indice = 0
   
        while indice < len(cadena):
            dato = cadena[indice]
            if dato == ” “:
                cadena = cadena[indice:]
           
            else:
                break
            indice = indice+1
        return cadena[1:]
#______________________________________________________________________________________________________
    def pc(cadena): #funcion para poner coma pc == poner coma
             i = 0
        
             while i < len(cadena):
                     dato = cadena[i]
                     if dato == ” “:                                                         #sustitur
                             cadena = cadena[:i] + “,” + cadena[1+i:]     #sustituir
                #print cadena                                                              #descomentar para comprobar
                break
            i = i+1
                
        return cadena
#_________________________________________________________________________________________________________
    def contar(cadena,indice):
        i = 0
        print len(cadena)
        while i < len(cadena):
            dato = cadena[i]
            if dato == ” “:
                print i
                break
            i = i+1
                 parte1 = “Point(%d)={” %indice
        cadena = parte1 + cadena[0:i]
       
        return cadena
#________________________________________________________________________________________________
    def contarsimple(cadena):
        i = 0
        while i < len(cadena):
            dato = cadena[i]
            if dato == ” “:
                break
            i = i+1
        cadena = cadena[0:i-2]+”,%f,%f}\n” % (distz,lc)
        return cadena
#___________________________________________________________________________________________________
    def final(cadena):
        i = 0
        cadena = cadena+”,0,lc}”
        return cadena
#__________________________________________________________________________________________________

    file1 = open(archivoviejo, “r”)
    file2 = open(archivonuevo, “w”)

    indice = 0                        #inicializamos a cero el indice

    while indice < numeropuntos:
        texto = file1.readline() #leemos la linea de texto


        texto = qe(texto)                              #llamada a funcion que quita los espacios
        texto = s.replace(texto, “,”, “.”)       #llamada a funcion que cambia comas por puntos
        texto =    pc(texto)                           #llamada a funcion que pone la coma tras la primera fila   
        texto = s.replace(texto, ” “,””)         #llamada a funcion que quita los espacios
        texto = contar(texto,indice)            #llamada a funcion que pone el numero de punto
        texto = contarsimple(texto)            #llamada a funcion que coloca el final

        indice = indice + 1   
        #if texto == “”:
        #    break
        file2.write(texto)
    file1.close()
    file2.close()

       
    return

copiadocumento(archivoviejo,archivonuevo)


Al programa solo hay que pasarle como referencia el archivo de origen (con las coordenadas del perfil y el nombre que queremos que tenga el archivo que genera. Simple.

Quien tenga tiempo puede mejorarlo, se pueden leer los puntos como floats y así pueden manipularse (giros del perfil, desplazamientos en el la dirección x e y…) A ver si encuentro un rato.


Esta entrada fue publicada en python. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s