You are on page 1of 60

Anexo III Rutinas para obtener los modelos de elementos finitos

Anexo III

RUTINAS PARA OBTENER LOS MODELOS DE ELEMENTOS FINITOS


Este anexo recoge todo el cdigo escrito en el lenguaje de programacin: FORTRAN. Son varios los programas que se debieron crear, para diversas aplicaciones. Su enumeracin en este anexo sigue el orden en el que aparecen sobre la memoria del proyecto. Para utilizar cualquiera de ellos es necesario ubicar el archivo .for y los diferentes archivos que el cdigo necesite, en la carpeta C:/FORTRAN/. O cambiar a la ruta deseada en la programacin del archivo Fortran.

98

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 1 % % "selnodosyeltos.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Imaginese que se tiene la definicin de nodos y elementos de un modelo. Tambin se tiene un grupo de elementos y sus nodos (pero no la definicin de los mismos) correspondientes a un submodelo del modelo inicial. Este programa permite obtener la definicin de los nodos y elementos del submodelo, a partir de la definicin de los nodos y elementos del modelo inicial. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,N_NODOS,FILAS,AUX,EXITO REAL*4 NODOS_MAX(MAX,4),NODOS[ALLOCATABLE](:,:),NRB_MAX(MAX,16), 1NRB[ALLOCATABLE](:,:),RN[ALLOCATABLE](:,:) INTEGER*4 E_PIEL,E_MAX(MAX,5),PIEL[ALLOCATABLE](:,:),FILASE, 1RB_MAX(MAX,16),RB[ALLOCATABLE](:,:),RE[ALLOCATABLE](:,:)

C C C

LEE LOS NODOS DEL ARCHIVO NODOS.txt Y LOS GUARDA EN LA VARIABLE "NODOS". CONTIENE LA DEFINICIN DE TODOS LOS NODOS DEL MODELO COMPLETO OPEN (unit=101,file='C:\FORTRAN\NODOS.txt',status='unknown') N_NODOS=0 DO I=1,MAX READ(101,*,END=16) (NODOS_MAX(I,J),J=1,4) N_NODOS=N_NODOS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',N_NODOS,'NODOS' CLOSE(unit=101,status='keep') ALLOCATE (NODOS(N_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,N_NODOS NODOS(I,1:4)=NODOS_MAX(I,1:4) ENDDO

C C C

LEE EL GRUPO DE NODOS DEL ARCHIVO nregboca.txt Y LOS GUARDA EN LA VARIABLE "NRB". SON LOS NODOS DE LA SELECCIN DEL MODELO DE BOCA OPEN (unit=101,file='C:\FORTRAN\nregboca.txt',status='unknown') FILAS=0 DO I=1,MAX READ(101,*,END=17) (NRB_MAX(I,J),J=1,16) FILAS=FILAS+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',FILAS,'FILAS' CLOSE(unit=101,status='keep') ALLOCATE (NRB(FILAS,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR"

99

Anexo III Rutinas para obtener los modelos de elementos finitos

ENDIF DO I=1,FILAS NRB(I,1:16)=NRB_MAX(I,1:16) ENDDO ALLOCATE (RN(FILAS*16,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C C LEE LOS ELEMENTOS DEL ARCHIVO PIEL.txt Y LOS GUARDA EN LA VARIABLE "PIEL". CONTIENE LA DEFINICIN DE TODOS LOS ELEMENTOS DE LA PIEL DEL MODELO COMPLETO OPEN (unit=101,file='C:\FORTRAN\PIEL.txt',status='unknown') E_PIEL=0 DO I=1,MAX READ(101,*,END=18) (E_MAX(I,J),J=1,5) E_PIEL=E_PIEL+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de eltos',E_PIEL,'E_PIEL' CLOSE(unit=101,status='keep') ALLOCATE (PIEL(E_PIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,E_PIEL PIEL(I,1:5)=E_MAX(I,1:5) ENDDO C C C LEE EL GRUPO DE ELEMENTOS DEL ARCHIVO regboca.txt Y LOS GUARDA EN LA VARIABLE "RB". SON LOS ELEMENTOS DE LA SELECCIN PARA EL MODELO DE BOCA OPEN (unit=101,file='C:\FORTRAN\regboca.txt',status='unknown') FILASE=0 DO I=1,MAX READ(101,*,END=19) (RB_MAX(I,J),J=1,16) FILASE=FILASE+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de eltos',FILASE,'FILASE' CLOSE(unit=101,status='keep') ALLOCATE (RB(FILASE,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,FILASE RB(I,1:16)=RB_MAX(I,1:16) ENDDO ALLOCATE (RE(FILASE*16,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C SELECCIONA LOS NODOS DEL GRUPO "NRB", DE ENTRE TODOS LA DEFINICIN DE TODOS LOS NODOS. PARA CONSEGUIR LA

100

Anexo III Rutinas para obtener los modelos de elementos finitos

C C

DEFINICIN EXCLUSIVA DEL GRUPO DE NODOS "NRB", GUARDANDO DICHA DEFINICIN EN LA VARIABLE "RN". AUX=0 DO I=1,FILAS DO J=1,16 IF(NRB(I,J).NE.0.0)THEN AUX=AUX+1 DO K=1,4 RN(AUX,K)=NODOS(NRB(I,J),K) ENDDO ENDIF ENDDO ENDDO SELECCIONA LOS ELTOS DEL GRUPO "RB", DE ENTRE TODOS LOS ELEMENTOS DE "PIEL". CONSIGUIENDO LA DEFINICIN DE LOS ELEMENTOS DEL GRUPO "RB", QUE SE GUARDA EN "RE" AUX=0 DO I=1,FILASE DO J=1,16 IF(RB(I,J).NE.0.0)THEN DO N=1,E_PIEL IF(RB(I,J).EQ.PIEL(N,1))THEN AUX=AUX+1 DO K=1,5 RE(AUX,K)=PIEL(N,K) ENDDO EXIT ENDIF ENDDO ENDIF ENDDO ENDDO

C C C

C C

ESCRIBE EL ARCHIVO regBOCA.inp QUE TIENE EL MODELO DE BOCA SELECCIONADO. OPEN (unit=101,file='regBOCA.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NTODO' DO I=1,FILAS*16 WRITE(101,11) INT(RN(I,1)),',',RN(I,2),',',RN(I,3),',',RN(I,4) ENDDO WRITE(101,*) '*ELEMENT, TYPE=C3D4, ELSET=ETODO' DO I=1,FILASE*16 WRITE(101,12) RE(I,1),',',RE(I,2),',',RE(I,3),',',RE(I,4),',',RE(I,5) ENDDO CLOSE(unit=101,status='keep') 11 FORMAT(I8,A1,F10.8,A1,F10.8,A1,F10.8) 12 FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) END

101

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 2 % % "n_comun_2grupos.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa proporciona la definicin de los nodos comunes a dos grupos de nodos. Para ello tambin es necesaria una variable que contenga la definicin de los nodos. En nuestro caso la definicin de los nodos de la regin de la boca. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,AUX,EXITO,N_NODOS REAL*4 NODOS_MAX(MAX,4),NODOS[ALLOCATABLE](:,:),NS(10000,4) INTEGER*4 CONT_G1,G1_MAX(MAX,16),G1[ALLOCATABLE](:,:), 1CONT_G2,G2_MAX(MAX,16),G2[ALLOCATABLE](:,:),COMUNES(10000,1)

C C

LEE LOS NODOS DEL ARCHIVO G1.txt Y LOS GUARDA EN LA VARIABLE "G1". OPEN (unit=101,file='C:\FORTRAN\G1.txt',status='unknown') CONT_G1=0 DO I=1,MAX READ(101,*,END=16) (G1_MAX(I,J),J=1,16) CONT_G1=CONT_G1+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_G1,'FILAS G1' CLOSE(unit=101,status='keep') ALLOCATE (G1(CONT_G1,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_G1 G1(I,1:16)=G1_MAX(I,1:16) ENDDO

C C

LEE LOS NODOS DEL ARCHIVO G2.txt Y LOS GUARDA EN LA VARIABLE "G2". OPEN (unit=101,file='C:\FORTRAN\G2.txt',status='unknown') CONT_G2=0 DO I=1,MAX READ(101,*,END=17) (G2_MAX(I,J),J=1,16) CONT_G2=CONT_G2+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_G2,'FILAS G2' CLOSE(unit=101,status='keep') ALLOCATE (G2(CONT_G2,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_G2 G2(I,1:16)=G2_MAX(I,1:16) ENDDO

102

Anexo III Rutinas para obtener los modelos de elementos finitos

C C

LEE LOS NODOS DEL ARCHIVO NODOS.txt Y LOS GUARDA EN LA VARIABLE "NODOS". OPEN (unit=101,file='C:\FORTRAN\NODOS.txt',status='unknown') N_NODOS=0 DO I=1,MAX READ(101,*,END=18) (NODOS_MAX(I,J),J=1,4) N_NODOS=N_NODOS+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',N_NODOS,'NODOS' CLOSE(unit=101,status='keep') ALLOCATE (NODOS(N_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,N_NODOS NODOS(I,1:4)=NODOS_MAX(I,1:4) ENDDO

C C

ALMACENA EN UN VECTOR COLUMNA TODOS LOS NODOS COMUNES A G1 Y G2 DICHO VECTOR SE LLAMA "COMUNES" AUX=0 DO I=1,CONT_G1 DO J=1,16 IF(G1(I,J).NE.0.0)THEN DO K=1,CONT_G2 DO L=1,16 IF(G1(I,J).EQ.G2(K,L))THEN AUX=AUX+1 COMUNES(AUX,1)=G1(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO SELECCIONA LOS NODOS DEL VECTOR "COMUNES", DE ENTRE TODOS LOS NODOS PARA OBTENER LA DEFINICION DE LOS NODOS COMUNES DO I=1,AUX DO J=1,N_NODOS IF(COMUNES(I,1).EQ.INT(NODOS(J,1)))THEN DO K=1,4 NS(I,K)=NODOS(J,K) ENDDO EXIT ENDIF ENDDO ENDDO ESCRIBE EL VECTOR COMUNES, CON LOS NODOS QUE PERTENECEN A LOS DOS GRUPOS OPEN (unit=101,file='COMUNES.txt',status='unknown') DO I=1,AUX WRITE(101,12) COMUNES(I,1) ENDDO

C C C

C C

103

Anexo III Rutinas para obtener los modelos de elementos finitos

12 C

11

CLOSE(unit=101,status='keep') FORMAT(I8) ESCRIBE LA DEFINICIN DE LOS NODOS COMUNES OPEN (unit=101,file='NODOS_SUPERFICIE.txt',status='unknown') DO I=1,AUX WRITE(101,11) INT(NS(I,1)),',',NS(I,2),',',NS(I,3),',',NS(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,F10.8,A1,F10.8,A1,F10.8) END

104

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 3 % % "proyecta.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa lee una superficie de nodos, los cuales son proyectados sobre un plano que se define a partir de tres nodos que pertenezcan al grupo de nodos de la superficie. Luego nos calcula los desplazamientos necesarios a dar a cada nodo de la superfice para que sea proyectado sobre el plano definido. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,M,N_NODOS,EXITO REAL*4 NPLANO(1,3),CNP(3,3),A(1),B(1),C(1),D(1), 1t(1),NS_MAX(MAX,4),NS[ALLOCATABLE](:,:), 2PN[ALLOCATABLE](:,:),DN[ALLOCATABLE](:,:)

LEE LOS NODOS DE LA SUPERFICIE OPEN (unit=101,file='C:\FORTRAN\NODOS_SUPERFICIE.txt', 1status='unknown') N_NODOS=0 DO I=1,MAX READ(101,*,END=16) (NS_MAX(I,J),J=1,4) N_NODOS=N_NODOS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',N_NODOS,'N_NODOS' CLOSE(unit=101,status='keep') ALLOCATE (NS(N_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (PN(N_NODOS,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (DN(N_NODOS,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,N_NODOS NS(I,1:4)=NS_MAX(I,1:4) ENDDO

C C

DEFINIR LOS NODOS QUE DEFINEN EL PLANO (ESCOGIDOS ENTRE LOS NODOS DE LA SUPERFICIE) NPLANO(1,1)=202471 NPLANO(1,2)=202538 NPLANO(1,3)=203991 [CNP] CONTIENE LAS COORDENADAS DE LOS TRES NODOS QUE DEFINEN EL PLANO K=1 J=1

C C

105

Anexo III Rutinas para obtener los modelos de elementos finitos

DO L=1,3 DO I=1,N_NODOS IF(NPLANO(K,L).EQ.NS(I,J))THEN DO M=2,4 CNP(L,M-1)=NS(I,M) ENDDO EXIT ENDIF ENDDO ENDDO C C C C C DEFINICIN DEL PLANO: SE DEFINIRAN 3 VBLES: (A,B,C) QUE SE CORRESPONDEN CON LAS TRES COMPONENTES (X,Y,Z) DEL VECTOR NORMAL AL PLANO. DICHO VECTOR SE DEFINE COMO EL PRODUCTO VECTORIAL DE LOS VECTORES QUE DEFINEN EL SEGUNDO Y EL TERCER NODO RESPECTO AL PRIMERO. A=((CNP(3,2)-CNP(1,2))*(CNP(2,3)-CNP(1,3)))-((CNP(3,3)1CNP(1,3))*(CNP(2,2)-CNP(1,2))) B=-(((CNP(3,1)-CNP(1,1))*(CNP(2,3)-CNP(1,3)))-((CNP(3,3)1CNP(1,3))*(CNP(2,1)-CNP(1,1)))) C=((CNP(3,1)-CNP(1,1))*(CNP(2,2)-CNP(1,2)))-((CNP(2,1)1CNP(1,1))*(CNP(3,2)-CNP(1,2))) COMPONENTE D: TERMINO INDEPENDIENTE D=A*CNP(1,1)+B*CNP(1,2)+C*CNP(1,3) PROYECCIN DE TODOS LOS NODOS DE LA SUPERFICIE SOBRE EL PLANO DEFINIDO DO I=1,N_NODOS t(1)=(D(1)-A(1)*NS(I,2)-B(1)*NS(I,3)-C(1)*NS(I,4))/ 1(A(1)**2+B(1)**2+C(1)**2) PN(I,1)=NS(I,2)+A(1)*t(1) PN(I,2)=NS(I,3)+B(1)*t(1) PN(I,3)=NS(I,4)+C(1)*t(1) ENDDO OBTENCIN DE LOS DESPLAZAMIENTOS A DAR PARA CADA NODO. RESTA LAS COORDENADAS DE LOS NODOS PROYECTADOS MENOS LAS COORDENADAS DE LOS MISMOS ANTES DE PROYECTARSE. ESTO NOS PROPORCIONA LAS CONDICIONES DE CONTORNO EN DESPLAZAMIENTOS A SIMULAR. DO I=1,N_NODOS DO J=1,3 DN(I,J)=PN(I,J)-NS(I,J+1) ENDDO ENDDO ESCRIBE LOS PARAMETROS A,B,C,D DEL PLANO DEFINIDO OPEN (unit=101,file='PLANO.txt',status='unknown') WRITE(101,11) A(1),',',B(1),',',C(1),',',D(1) CLOSE(unit=101,status='keep') FORMAT(F12.8,A1,F12.8,A1,F12.8,A1,F12.8) ESCRIBE LOS DESPLAZAMIENTOS A DAR A CADA NODO, DIRECTAMENTE COMO CONDICIONES DE CONTORNO EN DESPLAZAMIENTOS PARA ABAQUS OPEN (unit=101,file='CC.txt',status='unknown') DO I=1,N_NODOS J=1 K=2 L=3 WRITE(101,12) INT(NS(I,1)),',',J,',',J,',',DN(I,1)

C C C

C C C C

11 C C

106

Anexo III Rutinas para obtener los modelos de elementos finitos

12

WRITE(101,12) INT(NS(I,1)),',',K,',',K,',',DN(I,2) WRITE(101,12) INT(NS(I,1)),',',L,',',L,',',DN(I,3) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,F12.8) END

C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 4 %

107

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C

% "restringe.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa lee un grupo de nodos y los escribe con el formato de condicin de contorno de ABAQUS, con desplazamientos nulos. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,N_NODOS,EXITO,L,M INTEGER*4 M_MAX(MAX,16),Mcc0[ALLOCATABLE](:,:) REAL*4 CC(1)

C C

LEE EL GRUPO DE NODOS QUE SE TIENEN QUE ESCRIBIR COMO UN VECTOR CON DESPLAZAMIENTOS RESTRINGIDOS. OPEN (unit=101,file='C:\FORTRAN\Mcc0.txt',status='unknown') N_NODOS=0 DO I=1,MAX READ(101,*,END=16) (M_MAX(I,J),J=1,16) N_NODOS=N_NODOS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',N_NODOS,'N_NODOS' CLOSE(unit=101,status='keep') ALLOCATE (Mcc0(N_NODOS,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,N_NODOS Mcc0(I,1:16)=M_MAX(I,1:16) ENDDO

C C

11

ESCRIBE LOS NODOS CON LA CONDICIN DE CONTORNO DE DESPLAZAMIENTOS NULOS OPEN (unit=101,file='CC0.txt',status='unknown') L=1 M=3 CC=0.0 DO I=1,N_NODOS DO J=1,16 IF(Mcc0(I,J).NE.0)THEN WRITE(101,11) Mcc0(I,J),',',L,',',M,',',CC ENDIF ENDDO ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I4,A1,I4,A1,F10.6) END

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

108

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C

% Cdigo 5 % % "geomdef.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,N_NODOS,FILAS,EXITO,AUX REAL*4 NODOS_MAX(MAX,4),NODOS[ALLOCATABLE](:,:),U_MAX(MAX,4), 1U[ALLOCATABLE](:,:),GEOMDEF[ALLOCATABLE](:,:), 2NODOSGD[ALLOCATABLE](:,:) C C LEE LOS NODOS DEL ARCHIVO NODOS.txt Y LOS GUARDA EN LA VARIABLE "NODOS". OPEN (unit=101,file='C:\FORTRAN\NODOS.txt',status='unknown') N_NODOS=0 DO I=1,MAX READ(101,*,END=16) (NODOS_MAX(I,J),J=1,4) N_NODOS=N_NODOS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',N_NODOS,'NODOS' CLOSE(unit=101,status='keep') ALLOCATE (NODOS(N_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,N_NODOS NODOS(I,1:4)=NODOS_MAX(I,1:4) ENDDO C C LEE LOS DESPLAZAMIENTOS NODALES DE U.txt Y LOS GUARDA EN LA VARIABLE "U". OPEN (unit=101,file='C:\FORTRAN\U.txt',status='unknown') FILAS=0 DO I=1,MAX READ(101,*,END=17) (U_MAX(I,J),J=1,4) FILAS=FILAS+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',FILAS,'FILAS' CLOSE(unit=101,status='keep') ALLOCATE (U(FILAS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,FILAS U(I,1:4)=U_MAX(I,1:4) ENDDO ALLOCATE (GEOMDEF(FILAS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

109

Anexo III Rutinas para obtener los modelos de elementos finitos

ALLOCATE (NODOSGD(N_NODOS,4),STAT=EXITO) IF (EXITO.NE.0)THEN PRINT*,"ERROR" ENDIF C SUMA LOS DESPLAZAMIENTOS 'U', A LA DEFINICIN DE NODOS DE LA GEOMETRA C INDEFORMADA 'NODOS', PARA OBTENER LA DEFINICIN DE LOS NODOS DE LA GEOMETRA C DEFORMADA: ALMACENNDOSE STA EN LA VBLE 'GEOMDEF' C GEOMDEF CONTIENE SOLO LOS NODOS DE LA REGIN QUE SE SELECCION DE LA BOCA DO I=1,FILAS DO J=1,4 IF(J.NE.1)THEN IF(((U(I,J).LT.10E-30).AND.(U(I,J).GT.0)).OR. 2 ((U(I,J).GT.-10E-30).AND.(U(I,J).LT.0)))THEN U(I,J)=0.0 ENDIF GEOMDEF(I,J)=U(I,J)+NODOS(INT(U(I,1)),J) ELSE GEOMDEF(I,J)=U(I,J) ENDIF ENDDO ENDDO DO I=1,N_NODOS DO J=1,4 NODOSGD(I,J)=0 ENDDO ENDDO DO I=1,N_NODOS DO J=1,FILAS IF(INT(GEOMDEF(J,1)).EQ.NODOS(I,1))THEN NODOSGD(I,1)=1 AUX=J EXIT ENDIF ENDDO IF(NODOSGD(I,1).EQ.0)THEN DO K=1,4 NODOSGD(I,K)=NODOS(I,K) ENDDO ELSE DO K=1,4 NODOSGD(I,K)=GEOMDEF(AUX,K) ENDDO ENDIF ENDDO C ESCRIBE OPEN (unit=101,file='GEOMDEF.txt',status='unknown') DO I=1,FILAS WRITE(101,11) INT(GEOMDEF(I,1)),',',GEOMDEF(I,2) 2,',',GEOMDEF(I,3),',',GEOMDEF(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8)

11

110

Anexo III Rutinas para obtener los modelos de elementos finitos

OPEN (unit=101,file='NODOSGD.txt',status='unknown') DO I=1,N_NODOS WRITE(101,11) INT(NODOSGD(I,1)),',',NODOSGD(I,2) 2,',',NODOSGD(I,3),',',NODOSGD(I,4) ENDDO CLOSE(unit=101,status='keep') END

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

111

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C

% Cdigo 6 % % "separacin_comisura.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa obtiene primero la superficie de nodos comunes a dos grupos de nodos y su definicin. Posteriormente los duplica, comenzando la duplicacin en el ndice que deseemos. Y asigna, los nodos duplicados a formar parte de un grupo de elementos que indicamos. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,M,AUX,EXITO,CONT_NTODO,INICIODEFINICION,AUX2 REAL*4 NTODO_MAX(MAX,4),NTODO[ALLOCATABLE](:,:), 1DEFCOMUNES(10000,4),NDUPL(10000,4) INTEGER*4 CONT_NLABSUP,NLABSUP_MAX(MAX,16),NLABSUP[ALLOCATABLE] 1(:,:),CONT_NLABINF,NLABINF_MAX(MAX,16),NLABINF[ALLOCATABLE] 2(:,:),2CONT_LABINF,LABINF_MAX(MAX,16),LABINF[ALLOCATABLE](:,:), 3CONT_ETODO,ETODO_MAX(MAX,5),ETODO[ALLOCATABLE](:,:), 4ETODOMOD[ALLOCATABLE](:,:), 5NCOMUN(10000,1)

C C

LEE LOS NODOS DEL ARCHIVO NLABSUP.txt Y LOS GUARDA EN LA VARIABLE "NLABSUP". SON NODOS PERTENECIENTES AL LABIO SUPERIOR OPEN (unit=101,file='C:\FORTRAN\NLABSUP.txt',status='unknown') CONT_NLABSUP=0 DO I=1,MAX READ(101,*,END=16) (NLABSUP_MAX(I,J),J=1,16) CONT_NLABSUP=CONT_NLABSUP+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NLABSUP, 1'FILAS NLABSUP' CLOSE(unit=101,status='keep') ALLOCATE (NLABSUP(CONT_NLABSUP,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NLABSUP NLABSUP(I,1:16)=NLABSUP_MAX(I,1:16) ENDDO

C C

LEE LOS NODOS DEL ARCHIVO NLABINF.txt Y LOS GUARDA EN LA VARIABLE "NLABINF". SON NODOS PERTENECIENTES AL LABIO INFERIOR OPEN (unit=101,file='C:\FORTRAN\NLABINF.txt',status='unknown') CONT_NLABINF=0 DO I=1,MAX READ(101,*,END=17) (NLABINF_MAX(I,J),J=1,16) CONT_NLABINF=CONT_NLABINF+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NLABINF, 1'FILAS NLABINF' CLOSE(unit=101,status='keep') ALLOCATE (NLABINF(CONT_NLABINF,16),STAT=EXITO) IF (EXITO.NE.0) THEN

112

Anexo III Rutinas para obtener los modelos de elementos finitos

PRINT*,"ERROR" ENDIF DO I=1,CONT_NLABINF NLABINF(I,1:16)=NLABINF_MAX(I,1:16) ENDDO C C C LEE LOS NODOS DEL ARCHIVO NTODO.txt Y LOS GUARDA EN LA VARIABLE "NTODO". ES LA DEFINICIN DE TODOS LOS NODOS DEL MODELO DE LA BOCA OPEN (unit=101,file='C:\FORTRAN\NTODO.txt',status='unknown') CONT_NTODO=0 DO I=1,MAX READ(101,*,END=18) (NTODO_MAX(I,J),J=1,4) CONT_NTODO=CONT_NTODO+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',CONT_NTODO,'FILAS NTODO' CLOSE(unit=101,status='keep') ALLOCATE (NTODO(CONT_NTODO,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NTODO NTODO(I,1:4)=NTODO_MAX(I,1:4) ENDDO C C LEE EL GRUPO DE ELEMENTOS DEL LABIO INFERIOR DEL ARCHIVO LABINF.txt Y LOS GUARDA EN LA VARIABLE "LABINF" OPEN (unit=101,file='C:\FORTRAN\LABINF.txt',status='unknown') CONT_LABINF=0 DO I=1,MAX READ(101,*,END=19) (LABINF_MAX(I,J),J=1,16) CONT_LABINF=CONT_LABINF+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de nodos',CONT_LABINF,'FILAS LABINF' CLOSE(unit=101,status='keep') ALLOCATE (LABINF(CONT_LABINF,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_LABINF LABINF(I,1:16)=LABINF_MAX(I,1:16) ENDDO C C C C C LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO ETODO.txt Y LOS ALMACENA EN LA VARIABLE "ETODO". CONTIENE LA DEFINICIN DE TODOS LOS ELEMENTOS DEL MODELO DE LA BOCA SE ASIGNAN LAS MISMAS DIMENSIONES DE "ETODO" A LA VBLE "ETODOMOD". OPEN (unit=101,file='C:\FORTRAN\ETODO.txt',status='unknown') CONT_ETODO=0 DO I=1,MAX READ(101,*,END=20) (ETODO_MAX(I,J),J=1,5) CONT_ETODO=CONT_ETODO+1 ENDDO

113

Anexo III Rutinas para obtener los modelos de elementos finitos

20 WRITE(*,*) 'Terminada lectura de nodos',CONT_ETODO,'FILAS ETODO' CLOSE(unit=101,status='keep') ALLOCATE (ETODO(CONT_ETODO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ETODO ETODO(I,1:5)=ETODO_MAX(I,1:5) ENDDO ALLOCATE (ETODOMOD(CONT_ETODO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C ALMACENA EN UN VECTOR COLUMNA (VBLE "NCOMUN") TODOS LOS NODOS COMUNES A NLABSUP Y NLABINF AUX=0 DO I=1,CONT_NLABSUP DO J=1,16 IF(NLABSUP(I,J).NE.0.0)THEN DO K=1,CONT_NLABINF DO L=1,16 IF(NLABSUP(I,J).EQ.NLABINF(K,L))THEN AUX=AUX+1 NCOMUN(AUX,1)=NLABSUP(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO C C C C SELECCIONA LOS NODOS DEL VECTOR NCOMUN, DE ENTRE LA DEFINICION DE TODOS LOS NODOS DE LA VARIABLE "NTODO" PARA OBTENER LA DEFINICION DE NODOS COMUNES, ALMACENANDOLA EN "DEFCOMUNES" DO I=1,AUX DO J=1,CONT_NTODO IF(NCOMUN(I,1).EQ.INT(NTODO(J,1)))THEN DO K=1,4 DEFCOMUNES(I,K)=NTODO(J,K) ENDDO EXIT ENDIF ENDDO ENDDO DEFINE EL NUMERO DE NODO A PARTIR DEL CUAL SE COMIENZA LA DUPLICACIN INICIODEFINICION=500000 SE DUPLICAN LOS NODOS DE LA VARIABLE "DEFCOMUNES", ALMACENANDOSE LOS DUPLICADOS EN LA VARIABLE "NDUPL" AUX2=INICIODEFINICION+1

C C C C

114

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,AUX NDUPL(I,1)=AUX2 AUX2=AUX2+1 ENDDO DO I=1,AUX DO K=2,4 NDUPL(I,K)=DEFCOMUNES(I,K) ENDDO ENDDO C COPIA DE "ETODO" EN LA VBLE "ETODOMOD" DO I=1,CONT_ETODO DO J=1,5 ETODOMOD(I,J)=ETODO(I,J) ENDDO ENDDO LECTURA ELTO A ELTO DEL GRUPO "LABINF", LEYENDO DEFINICIN EN "ETODO", SE BUSCAN DE ENTRE LOS NODOS QUE DEFINEN ESTOS ELEMENTOS IGUALES A LOS DE NCOMUN. CUANDO SE ENCUENTRA SE VA ACTUALIZANDO LA VBLE "ETODOMOD" CON LOS NODOS DUPLICADOS. SE ESTN ASIGNANDO LOS NODOS DUPLICADOS A LA DEFINICIN DE LOS ELEMENTOS DEL LABIO INFERIOR. DO I=1,CONT_LABINF DO J=1,16 IF(LABINF(I,J).NE.0.0)THEN DO K=1,CONT_ETODO IF(LABINF(I,J).EQ.ETODOMOD(K,1))THEN DO L=1,AUX IF(NCOMUN(L,1).EQ.ETODOMOD(K,2))THEN ETODOMOD(K,2)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,3))THEN ETODOMOD(K,3)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,4))THEN ETODOMOD(K,4)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,5))THEN ETODOMOD(K,5)=INT(NDUPL(L,1)) ENDIF ENDDO ENDIF ENDDO ENDIF ENDDO ENDDO C C ESCRIBE EL VECTOR "NCOMUN", CON LOS NODOS QUE PERTENECEN A LA VEZ A LOS GRUPOS SUP E INF. ESTE SIRVE PARA COMPROBAR

C C C C C C C

115

Anexo III Rutinas para obtener los modelos de elementos finitos

21 C

OPEN (unit=101,file='NCOMUN.txt',status='unknown') DO I=1,AUX WRITE(101,21) NCOMUN(I,1) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8)

ESCRIBE LA DEFINICIN DE LOS NODOS DUPLICADOS: "NDUPL" OPEN (unit=101,file='NDUPL.txt',status='unknown') DO I=1,AUX WRITE(101,22) INT(NDUPL(I,1)),',',NDUPL(I,2),',',NDUPL(I,3), 1 ',',NDUPL(I,4) ENDDO CLOSE(unit=101,status='keep') 22 FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) C ESCRIBE LA DEFINICIN DE LOS NODOS COMUNES OPEN (unit=101,file='ETODOMOD.txt',status='unknown') DO I=1,CONT_ETODO WRITE(101,23) ETODOMOD(I,1),',',ETODOMOD(I,2),',',ETODOMOD(I,3), 1 ',',ETODOMOD(I,4),',',ETODOMOD(I,5) ENDDO CLOSE(unit=101,status='keep') 23 FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) C ESCRIBE EL GRUPO DE NODOS DUPLICADOS: "GNDUPL" OPEN (unit=101,file='GNDUPL.txt',status='unknown') DO I=1,AUX WRITE(101,21) INT(NDUPL(I,1)) ENDDO CLOSE(unit=101,status='keep') END

116

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 7 % % "crear_shell.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,AUX,AUX1,AUX2,AUX3,AUX5,EXITO INTEGER*4 CONT_NSLS,NSLS_MAX(MAX,1),NSLS[ALLOCATABLE](:,:), 1CONT_NSLI,NSLI_MAX(MAX,1),NSLI[ALLOCATABLE](:,:), 2CONT_ETODOMOD,ETODOMOD_MAX(MAX,5),ETODOMOD[ALLOCATABLE](:,:), 3ETODOAUX[ALLOCATABLE](:,:), 4CONT_ESLS,ESLS[ALLOCATABLE](:,:),SH_LS[ALLOCATABLE](:,:), 5CONT_ESLI,ESLI[ALLOCATABLE](:,:),SH_LI[ALLOCATABLE](:,:)

C C C C C

LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO "ETODOMOD.txt" Y LOS ALMACENA EN LA VARIABLE "ETODOMOD" ALMACENA MEMORIA PARA LA VBLE "ETODOAUX", DONDE COPIA EL CONTENIDO DE "ETODOMOD" AADINDOLE DOS COLUMNAS DE CEROS AL FINAL OPEN (unit=101,file='C:\FORTRAN\ETODOMOD.txt', 1status='unknown') CONT_ETODOMOD=0 DO I=1,MAX READ(101,*,END=15) (ETODOMOD_MAX(I,J),J=1,5) CONT_ETODOMOD=CONT_ETODOMOD+1 ENDDO 15 WRITE(*,*) 'Terminada lectura de nodos',CONT_ETODOMOD, 1'FILAS ETODOMOD' CLOSE(unit=101,status='keep') ALLOCATE (ETODOMOD(CONT_ETODOMOD,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (ETODOAUX(CONT_ETODOMOD,7),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ETODOMOD ETODOMOD(I,1:5)=ETODOMOD_MAX(I,1:5) ENDDO DO I=1,CONT_ETODOMOD ETODOAUX(I,1:5)=ETODOMOD_MAX(I,1:5) ENDDO DO I=1,CONT_ETODOMOD ETODOAUX(I,6:7)=0 ENDDO

C C

LEE LA DEFINICIN DEL ARCHIVO "NSUP_LABSUP.txt" Y LO ALMACENA EN NSLS OPEN (unit=101,file='C:\FORTRAN\NSUP_LABSUP.txt', 1status='unknown') CONT_NSLS=0 DO I=1,MAX READ(101,*,END=16) (NSLS_MAX(I,1))

117

Anexo III Rutinas para obtener los modelos de elementos finitos

CONT_NSLS=CONT_NSLS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NSLS, 1'FILAS NSLS' CLOSE(unit=101,status='keep') ALLOCATE (NSLS(CONT_NSLS,1),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NSLS NSLS(I,1)=NSLS_MAX(I,1) ENDDO C C LEE LA DEFINICIN DEL ARCHIVO "NSUP_LABINF.txt" Y LO ALMACENA EN NSLI OPEN (unit=101,file='C:\FORTRAN\NSUP_LABINF.txt', 1status='unknown') CONT_NSLI=0 DO I=1,MAX READ(101,*,END=17) (NSLI_MAX(I,1)) CONT_NSLI=CONT_NSLI+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NSLI, 1'FILAS NSLI' CLOSE(unit=101,status='keep') ALLOCATE (NSLI(CONT_NSLI,1),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NSLI NSLI(I,1)=NSLI_MAX(I,1) ENDDO C C C EN LA 6 COLUMNA DE "ETODOAUX" SE PONE UN 1 SI EN DICHA FILA HAY TRES NODOS QUE PERTENEZCAN AL GRUPO DE NODOS "NSLS" CONT_ESLS=0 DO I=1,CONT_ETODOMOD AUX=0 DO J=2,5 DO K=1,CONT_NSLS IF(NSLS(K,1).EQ.ETODOMOD(I,J))THEN AUX=AUX+1 IF(AUX.EQ.3)THEN ETODOAUX(I,6)=1 CONT_ESLS=CONT_ESLS+1 ENDIF ENDIF ENDDO ENDDO ENDDO ALMACENO MEMORIA PARA LA VBLE "ESLS" Y "SH_LS" ALLOCATE (ESLS(CONT_ESLS,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR"

118

Anexo III Rutinas para obtener los modelos de elementos finitos

ENDIF ALLOCATE (SH_LS(CONT_ESLS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C C EN LA 7 COLUMNA DE "ETODOAUX" SE PONE UN 1 SI EN DICHA FILA HAY TRES NODOS QUE PERTENEZCAN AL GRUPO DE NODOS "NSLI" CONT_ESLI=0 DO I=1,CONT_ETODOMOD AUX=0 DO J=2,5 DO K=1,CONT_NSLI IF(NSLI(K,1).EQ.ETODOMOD(I,J))THEN AUX=AUX+1 IF(AUX.EQ.3)THEN ETODOAUX(I,7)=1 CONT_ESLI=CONT_ESLI+1 ENDIF ENDIF ENDDO ENDDO ENDDO ALMACENO MEMORIA PARA LA VBLE "ESLI" Y "SH_LI" ALLOCATE (ESLI(CONT_ESLI,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (SH_LI(CONT_ESLI,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C C C ALMACENO LA DEFINICIN DE LOS ELEMENTOS QUE TIENEN UN 1 EN LA 6 COLUMNA DE "ETODOAUX", EN LA VBLE "ESLS". ES DECIR, NOS QUEDAMOS CON LOS ELEMENTOS DEL LABIO SUPERIOR QUE TIENEN UNA CARA QUE PERTENECERA AL CONTACTO AUX5=1 DO I=1,CONT_ETODOMOD IF(ETODOAUX(I,6).EQ.1)THEN ESLS(AUX5,1:5)=ETODOAUX(I,1:5) AUX5=AUX5+1 ENDIF ENDDO ALMACENO LA DEFINICIN DE LOS ELEMENTOS QUE TIENEN UN 1 EN LA 7 COLUMNA DE "ETODOAUX", EN LA VBLE "ESLI". ES DECIR, NOS QUEDAMOS CON LOS ELEMENTOS DEL LABIO INFERIOR QUE TIENEN UNA CARA QUE PERTENECERA AL CONTACTO AUX5=1 DO I=1,CONT_ETODOMOD IF(ETODOAUX(I,7).EQ.1)THEN ESLI(AUX5,1:5)=ETODOAUX(I,1:5) AUX5=AUX5+1 ENDIF ENDDO

C C C C

119

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C

SE CREAN LOS SHELL DEL LABIO SUPERIOR. DE LOS ELEMENTOS DE "ESLS" SE BORRA EL NODO QUE NO PERTENECE AL GRUPO "NSLS", QUEDANDO LA DEFINICIN DEL ELEMENTO SHELL (POR TRES NODOS) DE LA SUPERFICIEDEL LABIO SUPERIOR, QUE SE ALMACENA EN "SH_LS" AUX1=5000001 DO I=1,CONT_ESLS SH_LS(I,1)=AUX1 AUX1=AUX1+1 ENDDO DO I=1,CONT_ESLS AUX3=2 DO J=2,5 DO K=1,CONT_NSLS IF(NSLS(K,1).EQ.ESLS(I,J))THEN SH_LS(I,AUX3)=ESLS(I,J) AUX3=AUX3+1 ENDIF ENDDO ENDDO ENDDO SE CREAN LOS SHELL DEL LABIO INFERIOR. DE LOS ELEMENTOS DE "ESLI" SE BORRA EL NODO QUE NO PERTENECE AL GRUPO "NSLI", QUEDANDO LA DEFINICIN DEL ELEMENTO SHELL (POR TRES NODOS) DE LA SUPERFICIE DEL LABIO INFERIOR, QUE SE ALMACENA EN "SH_LI" AUX2=6000001 DO I=1,CONT_ESLI SH_LI(I,1)=AUX2 AUX2=AUX2+1 ENDDO DO I=1,CONT_ESLI AUX3=2 DO J=2,5 DO K=1,CONT_NSLI IF(NSLI(K,1).EQ.ESLI(I,J))THEN SH_LI(I,AUX3)=ESLI(I,J) AUX3=AUX3+1 ENDIF ENDDO ENDDO ENDDO ESCRIBE LA VARIABLE "SH_LS" OPEN (unit=101,file='SH_LS.txt',status='unknown') DO I=1,CONT_ESLS WRITE(101,21) SH_LS(I,1),',',SH_LS(I,2),',' 1 ,SH_LS(I,3),',',SH_LS(I,4) ENDDO CLOSE(unit=101,status='keep') ESCRIBE LA VARIABLE "SH_LI" OPEN (unit=101,file='SH_LI.txt',status='unknown') DO I=1,CONT_ESLI WRITE(101,21) SH_LI(I,1),',',SH_LI(I,2),',' 1 ,SH_LI(I,3),',',SH_LI(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,I8) END

C C C C C

21

120

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 8 % % "actmod_completo.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,EXITO,CONT_NODOS,CONT_NTODO REAL*4 NODOS_MAX(MAX,4),NODOS[ALLOCATABLE](:,:), 1NTODO_MAX(MAX,4),NTODO[ALLOCATABLE](:,:), 2NODOS2[ALLOCATABLE](:,:) INTEGER*4 CONT_PIEL,PIEL_MAX(MAX,5),PIEL[ALLOCATABLE](:,:), 1CONT_ETODOMOD,ETODOMOD_MAX(MAX,5),ETODOMOD[ALLOCATABLE](:,:), 2PIEL2[ALLOCATABLE](:,:)

C C C C

LEE LA CREACIN DE NODOS DEL ARCHIVO "NODOS.txt" Y LO GUARDA EN LA VBLE "NODOS" ALMACENA MEMORIA PARA LA VBLE "NODOS2" Y COPIA LA VBLE "NODOS" EN "NODOS2" OPEN (unit=101,file='C:\FORTRAN\NODOS.txt',status='unknown') CONT_NODOS=0 DO I=1,MAX READ(101,*,END=16) (NODOS_MAX(I,J),J=1,4) CONT_NODOS=CONT_NODOS+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS, 1'FILAS NODOS' CLOSE(unit=101,status='keep') ALLOCATE (NODOS(CONT_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (NODOS2(CONT_NODOS,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS NODOS(I,1:4)=NODOS_MAX(I,1:4) NODOS2(I,1:4)=NODOS_MAX(I,1:4) ENDDO

C C

LEE LA CREACIN DE NODOS DEL ARCHIVO "NTODO.txt" Y LO GUARDA EN LA VBLE "NTODO" OPEN (unit=101,file='C:\FORTRAN\NTODO.txt',status='unknown') CONT_NTODO=0 DO I=1,MAX READ(101,*,END=17) (NTODO_MAX(I,J),J=1,4) CONT_NTODO=CONT_NTODO+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NTODO, 1'FILAS NTODO' CLOSE(unit=101,status='keep') ALLOCATE (NTODO(CONT_NTODO,4),STAT=EXITO)

121

Anexo III Rutinas para obtener los modelos de elementos finitos

IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NTODO NTODO(I,1:4)=NTODO_MAX(I,1:4) ENDDO C C LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO ETODOMOD.txt Y LOS ALMACENA EN LA VARIABLE "ETODOMOD" OPEN (unit=101,file='C:\FORTRAN\ETODOMOD.txt',status='unknown') CONT_ETODOMOD=0 DO I=1,MAX READ(101,*,END=18) (ETODOMOD_MAX(I,J),J=1,5) CONT_ETODOMOD=CONT_ETODOMOD+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',CONT_ETODOMOD, 1'FILAS ETODOMOD' CLOSE(unit=101,status='keep') ALLOCATE (ETODOMOD(CONT_ETODOMOD,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ETODOMOD ETODOMOD(I,1:5)=ETODOMOD_MAX(I,1:5) ENDDO C C C C LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO PIEL.txt Y LOS ALMACENA EN LA VARIABLE "PIEL" ALMACENA MEMORIA PARA LA VBLE "PIEL2" Y COPIA LA VBLE "PIEL" EN "PIEL2" OPEN (unit=101,file='C:\FORTRAN\PIEL.txt',status='unknown') CONT_PIEL=0 DO I=1,MAX READ(101,*,END=19) (PIEL_MAX(I,J),J=1,5) CONT_PIEL=CONT_PIEL+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de nodos',CONT_PIEL, 1'FILAS PIEL' CLOSE(unit=101,status='keep') ALLOCATE (PIEL(CONT_PIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (PIEL2(CONT_PIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_PIEL PIEL(I,1:5)=PIEL_MAX(I,1:5) PIEL2(I,1:5)=PIEL_MAX(I,1:5) ENDDO C C ACTUALIZA LA VARIABLE "PIEL" CON "ETODOMOD", SE GUARDA EN "PIEL2"

122

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,CONT_ETODOMOD DO J=1,CONT_PIEL IF(ETODOMOD(I,1).EQ.PIEL(J,1))THEN PIEL2(J,2:5)=ETODOMOD(I,2:5) ENDIF ENDDO ENDDO C C ACTUALIZA LA VARIABLE "NODOS" CON "NTODO", SE GUARDA EN "NODOS2" DO I=1,CONT_NTODO DO J=1,CONT_NODOS IF(NTODO(I,1).EQ.NODOS(J,1))THEN NODOS2(J,2:4)=NTODO(I,2:4) ENDIF ENDDO ENDDO ESCRIBE LA VARIABLE "NODOS2" OPEN (unit=101,file='NODOS2.txt',status='unknown') DO I=1,CONT_NODOS WRITE(101,21) INT(NODOS2(I,1)),',',NODOS2(I,2),',' 1 ,NODOS2(I,3),',',NODOS2(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) ESCRIBE LA VARIABLE "PIEL2" OPEN (unit=101,file='PIEL2.txt',status='unknown') DO I=1,CONT_PIEL WRITE(101,22) PIEL2(I,1),',',PIEL2(I,2),',',PIEL2(I,3), 1 ',',PIEL2(I,4),',',PIEL2(I,5) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) END

21 C

22

123

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 9 % % "comunes_y_duplica.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa selecciona los nodos comunes a los grupos: "NPIEL" y "NHUESO". Luego busca los nodos comunes que pertenezcan al grupo de nodos "NAUX_VEST", guardndose en "NVEST". Se definen los nodos de "NVEST" con ayuda de la variable "NODOS2" que tiene la definicin de todos los nodos del modelo. Se duplica "NVEST" en la variable "NDUPL". Finalmente se sustituyen los nodos duplicados por los correspondientes nodos de la definicin de elementos del grupo Hueso. PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,AUX,AUX2,AUX3,EXITO,CONT_NODOS2, 1INICIODEFINICION REAL*4 NODOS2_MAX(MAX,4),NODOS2[ALLOCATABLE](:,:), 1DEF_NVEST[ALLOCATABLE](:,:),NDUPL[ALLOCATABLE](:,:) INTEGER*4 CONT_NPIEL,NPIEL_MAX(MAX,16),NPIEL[ALLOCATABLE](:,:), 1CONT_NHUESO,NHUESO_MAX(MAX,16),NHUESO[ALLOCATABLE](:,:), 2CONT_HUESO,HUESO_MAX(MAX,5),HUESO[ALLOCATABLE](:,:), 3CONT_NAUX_VEST,NAUX_VEST_MAX(MAX,16),NAUX_VEST[ALLOCATABLE] 4(:,:),COMUNES(100000,1),NVEST(100000,1), 5HUESO2[ALLOCATABLE](:,:)

C C

LEE LOS NODOS DEL ARCHIVO NAUX_VEST.txt Y LOS GUARDA EN LA VARIABLE "NAUX_VEST". OPEN (unit=101,file='C:\FORTRAN\NAUX_VEST.txt', 1status='unknown') CONT_NAUX_VEST=0 DO I=1,MAX READ(101,*,END=14) (NAUX_VEST_MAX(I,J),J=1,16) CONT_NAUX_VEST=CONT_NAUX_VEST+1 ENDDO 14 WRITE(*,*) 'Terminada lectura de nodos',CONT_NAUX_VEST, 2'FILAS NAUX_VEST' CLOSE(unit=101,status='keep') ALLOCATE (NAUX_VEST(CONT_NAUX_VEST,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NAUX_VEST NAUX_VEST(I,1:16)=NAUX_VEST_MAX(I,1:16) ENDDO

C C

LEE LOS NODOS DEL ARCHIVO NPIEL.txt Y LOS GUARDA EN LA VARIABLE "NPIEL". OPEN (unit=101,file='C:\FORTRAN\NPIEL.txt',status='unknown') CONT_NPIEL=0 DO I=1,MAX READ(101,*,END=15) (NPIEL_MAX(I,J),J=1,16) CONT_NPIEL=CONT_NPIEL+1 ENDDO 15 WRITE(*,*) 'Terminada lectura de nodos',CONT_NPIEL,

124

Anexo III Rutinas para obtener los modelos de elementos finitos

1'FILAS NPIEL' CLOSE(unit=101,status='keep') ALLOCATE (NPIEL(CONT_NPIEL,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NPIEL NPIEL(I,1:16)=NPIEL_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NHUESO.txt Y LOS GUARDA EN LA VARIABLE "NHUESO". OPEN (unit=101,file='C:\FORTRAN\NHUESO.txt',status='unknown') CONT_NHUESO=0 DO I=1,MAX READ(101,*,END=16) (NHUESO_MAX(I,J),J=1,16) CONT_NHUESO=CONT_NHUESO+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NHUESO, 1'FILAS NHUESO' CLOSE(unit=101,status='keep') ALLOCATE (NHUESO(CONT_NHUESO,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NHUESO NHUESO(I,1:16)=NHUESO_MAX(I,1:16) ENDDO C C C LEE LOS NODOS DEL ARCHIVO NODOS2.txt Y LOS GUARDA EN LA VARIABLE "NODOS2". CONTIENE LA DEFINICIN DE TODOS LOS NODOS DEL MODELO. OPEN (unit=101,file='C:\FORTRAN\NODOS2.txt',status='unknown') CONT_NODOS2=0 DO I=1,MAX READ(101,*,END=17) (NODOS2_MAX(I,J),J=1,4) CONT_NODOS2=CONT_NODOS2+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS2, 1'FILAS NODOS2' CLOSE(unit=101,status='keep') ALLOCATE (NODOS2(CONT_NODOS2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS2 NODOS2(I,1:4)=NODOS2_MAX(I,1:4) ENDDO C C C LEE LA DEFINICIN DE ELEMENTOS DEL HUESO DEL ARCHIVO HUESO.txt Y LOS GUARDA EN LA VARIABLE "HUESO". TAMBIEN SE COPIA HUESO EN HUESO2. OPEN (unit=101,file='C:\FORTRAN\HUESO.txt',status='unknown') CONT_HUESO=0

125

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,MAX READ(101,*,END=18) (HUESO_MAX(I,J),J=1,5) CONT_HUESO=CONT_HUESO+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',CONT_HUESO,'FILAS HUESO' CLOSE(unit=101,status='keep') ALLOCATE (HUESO(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO(I,1:5)=HUESO_MAX(I,1:5) ENDDO ALLOCATE (HUESO2(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO2(I,1:5)=HUESO_MAX(I,1:5) ENDDO C C ALMACENA EN UN VECTOR COLUMNA TODOS LOS NODOS COMUNES A NPIEL Y NHUESO AUX=0 DO I=1,CONT_NPIEL DO J=1,16 IF(NPIEL(I,J).NE.0.0)THEN DO K=1,CONT_NHUESO DO L=1,16 IF(NPIEL(I,J).EQ.NHUESO(K,L))THEN AUX=AUX+1 COMUNES(AUX,1)=NPIEL(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO SELECCIONA LOS NODOS DEL VECTOR COMUNES, DENTRO DEL GRUPO "NAUX_VEST". PARA OBTENER LOS NODOS COMUNES ENTRE PIEL Y HUESO DEL VESTIBULO: "NVEST". Y SE GUARDA MEMORIA PARA DEF_NVEST Y NDUPL. AUX2=0 DO I=1,AUX DO J=1,CONT_NAUX_VEST DO K=1,16 IF(COMUNES(I,1).EQ.NAUX_VEST(J,K))THEN AUX2=AUX2+1 NVEST(AUX2,1)=NAUX_VEST(J,K) EXIT ENDIF ENDDO ENDDO ENDDO

C C C C

126

Anexo III Rutinas para obtener los modelos de elementos finitos

ALLOCATE (DEF_NVEST(AUX2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (NDUPL(AUX2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C C SELECCIONA LOS NODOS DEL VECTOR "NVEST", DE ENTRE LA DEFINICIN DE TODOS LOS NODOS EN "NODOS2". PARA OBTENER LA DEFINICIN DE LOS NODOS COMUNES ENTRE PIEL Y HUESO DEL VESTIBULO DO I=1,AUX2 DO J=1,CONT_NODOS2 IF(NVEST(I,1).EQ.INT(NODOS2(J,1)))THEN DO K=1,4 DEF_NVEST(I,K)=NODOS2(J,K) ENDDO EXIT ENDIF ENDDO ENDDO DEFINE EL NUMERO DE NODO A PARTIR DEL CUAL SE COMIENZA LA DUPLICACIN INICIODEFINICION=600000 SE DUPLICAN LOS NODOS DE LA VARIABLE "DEF_NVEST", ALMACENANDOSE LOS DUPLICADOS EN LA VARIABLE "NDUPL" AUX3=INICIODEFINICION+1 DO I=1,AUX2 NDUPL(I,1)=AUX3 AUX3=AUX3+1 ENDDO DO I=1,AUX2 DO K=2,4 NDUPL(I,K)=DEF_NVEST(I,K) ENDDO ENDDO LECTURA ELTO A ELTO DE "HUESO" SE BUSCAN DE ENTRE LOS NODOS QUE DEFINEN ESTOS ELEMENTOS IGUALES A LOS DE "NVEST" CDO SE ENCUENTRA SE VA ACTUALIZANDO LA VBLE "HUESO2" CON LOS NODOS DUPLICADOS "NDUPL" DO I=1,CONT_HUESO DO K=1,AUX2 IF(NVEST(K,1).EQ.HUESO(I,2))THEN HUESO2(I,2)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,3))THEN HUESO2(I,3)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,4))THEN HUESO2(I,4)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,5))THEN HUESO2(I,5)=INT(NDUPL(K,1))

C C C C

C C C C C

127

Anexo III Rutinas para obtener los modelos de elementos finitos

ENDIF ENDDO ENDDO C C ESCRIBE EL VECTOR "COMUNES", CON LOS NODOS QUE PERTENECEN A PIEL Y HUESO OPEN (unit=101,file='COMUNES.txt',status='unknown') DO I=1,AUX WRITE(101,12) COMUNES(I,1) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8) ESCRIBE EL VECTOR "NVEST", CON LOS NODOS QUE PERTENECEN A PIEL Y HUESO EN EL VESTIBULO OPEN (unit=101,file='NVEST.txt',status='unknown') DO I=1,AUX2 WRITE(101,12) NVEST(I,1) ENDDO CLOSE(unit=101,status='keep') ESCRIBE LA DEFINICIN DE LOS NODOS COMUNES A PIEL Y HUESO DEL VESTIBULO, QUE SE ENCUENTRAN EN LA VBLE "DEF_NVEST" OPEN (unit=101,file='DEF_NVEST.txt',status='unknown') DO I=1,AUX2 WRITE(101,11) INT(DEF_NVEST(I,1)),',',DEF_NVEST(I,2), 1',',DEF_NVEST(I,3),',',DEF_NVEST(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) ESCRIBE LA DEFINICIN DE LOS NODOS DUPLICADOS: "NDUPL" OPEN (unit=101,file='NDUPL.txt',status='unknown') DO I=1,AUX2 WRITE(101,11) INT(NDUPL(I,1)),',',NDUPL(I,2),',', 1NDUPL(I,3),',',NDUPL(I,4) ENDDO CLOSE(unit=101,status='keep') ESCRIBE LA NUEVA DEFINICIN DE "HUESO" ("HUESO2") OPEN (unit=101,file='HUESO2.txt',status='unknown') DO I=1,CONT_HUESO WRITE(101,13) HUESO2(I,1),',',HUESO2(I,2),',',HUESO2(I,3), 1 ',',HUESO2(I,4),',',HUESO2(I,5) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) ESCRIBE EL GRUPO DE NODOS DUPLICADOS: "GNDUPL" OPEN (unit=101,file='GNDUPL.txt',status='unknown') DO I=1,AUX2 WRITE(101,12) INT(NDUPL(I,1)) ENDDO CLOSE(unit=101,status='keep') END

12 C C

C C

11 C

13 C

128

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 10 % % "separar_mandibula.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa permite separar el grupo seleccionado como mandbula del resto de estructura sea. Se parte de los archivos NPyH, HUESO, PIEL, NODOS_MAND, NODOS_MSYC, MAXSUP_Y_CRANEO y MANDIBULA. Se comienza con la creacin de la definicin de los elementos de la mandbula y del maxilar superior y craneo. Luego se buscan los nodos comunes a estos dos grupos y se duplican. Por ltimo se asignan los nodos duplicados a la definicin del maxilar superior y crneo, y se actualiza la variable NPyH con los nuevos nodos duplicados.

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,AUX,AUX2,COMUNES,INICIODEFINICION INTEGER*4 CONT_NPyH REAL*4 NPyH_MAX(MAX,4),NPyH[ALLOCATABLE](:,:), 1DEF_COMUNES[ALLOCATABLE](:,:),DEF_DUPLICADOS[ALLOCATABLE](:,:) INTEGER*4 CONT_HUESO,HUESO_MAX(MAX,5),HUESO[ALLOCATABLE](:,:) INTEGER*4 CONT_PIEL,PIEL_MAX(MAX,5),PIEL[ALLOCATABLE](:,:) INTEGER*4 CONT_NODOS_MAND,NODOS_MAND_MAX(MAX,16), 1NODOS_MAND[ALLOCATABLE](:,:) INTEGER*4 CONT_NODOS_MSYC,NODOS_MSYC_MAX(MAX,16), 1NODOS_MSYC[ALLOCATABLE](:,:) INTEGER*4 CONT_MAXSUP_Y_CRANEO,MAXSUP_Y_CRANEO_MAX(MAX,16), 1MAXSUP_Y_CRANEO[ALLOCATABLE](:,:) INTEGER*4 CONT_MANDIBULA,MANDIBULA_MAX(MAX,16), 1MANDIBULA[ALLOCATABLE](:,:) INTEGER*4 DEF_MAND(200000,5),DEF_MSYC(250000,5),CONT_DEFMAND, 1CONT_DEFMSYC,DEF_MSYCMOD[ALLOCATABLE](:,:) C C LEE LOS NODOS DEL ARCHIVO NPyH.txt Y LOS GUARDA EN LA VARIABLE "NPyH". OPEN (unit=101,file='C:\FORTRAN\NPyH.inp',status='unknown') CONT_NPyH=0 DO I=1,MAX READ(101,*,END=14) (NPyH_MAX(I,J),J=1,4) CONT_NPyH=CONT_NPyH+1 ENDDO 14 WRITE(*,*) 'Terminada lectura de nodos',CONT_NPyH, 2'FILAS NPyH' CLOSE(unit=101,status='keep') ALLOCATE (NPyH(CONT_NPyH,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

129

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,CONT_NPyH NPyH(I,1:4)=NPyH_MAX(I,1:4) ENDDO C C LEE EL ARCHIVO DE CREACIN DE ELEMENTOS DE HUESO, A PARTIR DE HUESO.inp Y LO ALMACENA EN VARIABLE: "HUESO" OPEN (unit=101,file='C:\FORTRAN\HUESO.inp',status='unknown') CONT_HUESO=0 DO I=1,MAX READ(101,*,END=15) (HUESO_MAX(I,J),J=1,5) CONT_HUESO=CONT_HUESO+1 ENDDO 15 WRITE(*,*) 'Terminada lectura de nodos',CONT_HUESO,'FILAS HUESO' CLOSE(unit=101,status='keep') ALLOCATE (HUESO(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO(I,1:5)=HUESO_MAX(I,1:5) ENDDO C C LEE EL ARCHIVO DE CREACIN DE ELEMENTOS DE PIEL, A PARTIR DE PIEL.inp Y LO ALMACENA EN VARIABLE: "PIEL" OPEN (unit=101,file='C:\FORTRAN\PIEL.inp',status='unknown') CONT_PIEL=0 DO I=1,MAX READ(101,*,END=16) (PIEL_MAX(I,J),J=1,5) CONT_PIEL=CONT_PIEL+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_PIEL,'FILAS PIEL' CLOSE(unit=101,status='keep') ALLOCATE (PIEL(CONT_PIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_PIEL PIEL(I,1:5)=PIEL_MAX(I,1:5) ENDDO ALLOCATE (HUESO2(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO2(I,1:5)=HUESO_MAX(I,1:5) ENDDO C C LEE LOS NODOS DEL ARCHIVO NODOS_MAND.inp Y LOS GUARDA EN LA VARIABLE "NODOS_MAND". OPEN (unit=101,file='C:\FORTRAN\NODOS_MAND.inp',status='unknown') CONT_NODOS_MAND=0 DO I=1,MAX READ(101,*,END=19) (NODOS_MAND_MAX(I,J),J=1,16)

130

Anexo III Rutinas para obtener los modelos de elementos finitos

CONT_NODOS_MAND=CONT_NODOS_MAND+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS_MAND, 1'FILAS NODOS_MAND' CLOSE(unit=101,status='keep') ALLOCATE (NODOS_MAND(CONT_NODOS_MAND,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS_MAND NODOS_MAND(I,1:16)=NODOS_MAND_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NODOS_MSYC.inp Y LOS GUARDA EN LA VARIABLE "NODOS_MSYC". OPEN (unit=101,file='C:\FORTRAN\NODOS_MSYC.inp',status='unknown') CONT_NODOS_MSYC=0 DO I=1,MAX READ(101,*,END=20) (NODOS_MSYC_MAX(I,J),J=1,16) CONT_NODOS_MSYC=CONT_NODOS_MSYC+1 ENDDO 20 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS_MSYC, 1'FILAS NODOS_MSYC' CLOSE(unit=101,status='keep') ALLOCATE (NODOS_MSYC(CONT_NODOS_MSYC,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS_MSYC NODOS_MSYC(I,1:16)=NODOS_MSYC_MAX(I,1:16) ENDDO C C LEE LOS ELTOS MAXSUP_Y_CRANEO.inp Y LOS GUARDA EN LA VARIABLE "MAXSUP_Y_CRANEO". OPEN (unit=101,file='C:\FORTRAN\MAXSUP_Y_CRANEO.inp',status='unknown') CONT_MAXSUP_Y_CRANEO=0 DO I=1,MAX READ(101,*,END=21) (MAXSUP_Y_CRANEO_MAX(I,J),J=1,16) CONT_MAXSUP_Y_CRANEO=CONT_MAXSUP_Y_CRANEO+1 ENDDO 21 WRITE(*,*) 'Terminada lectura de nodos',CONT_MAXSUP_Y_CRANEO, 1'FILAS MAXSUP_Y_CRANEO' CLOSE(unit=101,status='keep') ALLOCATE (MAXSUP_Y_CRANEO(CONT_MAXSUP_Y_CRANEO,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_MAXSUP_Y_CRANEO MAXSUP_Y_CRANEO(I,1:16)=MAXSUP_Y_CRANEO_MAX(I,1:16) ENDDO C LEE LOS ELTOS MANDIBULA.inp Y LOS GUARDA EN LA

131

Anexo III Rutinas para obtener los modelos de elementos finitos

VARIABLE "MANDIBULA". OPEN (unit=101,file='C:\FORTRAN\MANDIBULA.inp',status='unknown') CONT_MANDIBULA=0 DO I=1,MAX READ(101,*,END=22) (MANDIBULA_MAX(I,J),J=1,16) CONT_MANDIBULA=CONT_MANDIBULA+1 ENDDO 22 WRITE(*,*) 'Terminada lectura de nodos',CONT_MANDIBULA,'FILAS MANDIBULA' CLOSE(unit=101,status='keep') ALLOCATE (MANDIBULA(CONT_MANDIBULA,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_MANDIBULA MANDIBULA(I,1:16)=MANDIBULA_MAX(I,1:16) ENDDO C WRITE(*,*) 'Terminada lectura vbles e inicio definicin' C C CREA LA DEFINICIN DE ELEMENTOS DE LA MANDIBULA. PARA ELLO, SE VA LEYENDO C LA VARIABLE QUE CONTIENE EL GRUPO DE ELEMENTOS DE LA MISMA: "MANDIBULA", Y C SE BUSCA LA DEFINICIN DE ESTOS EN "HUESO", DEFINIENDO "DEF_MAND" CONT_DEFMAND=0 DO I=1,CONT_MANDIBULA DO J=1,16 IF(MANDIBULA(I,J).NE.0.0)THEN DO K=1,CONT_HUESO IF(MANDIBULA(I,J).EQ.HUESO(K,1))THEN CONT_DEFMAND=CONT_DEFMAND+1 DEF_MAND(CONT_DEFMAND,1)=HUESO(K,1) DEF_MAND(CONT_DEFMAND,2)=HUESO(K,2) DEF_MAND(CONT_DEFMAND,3)=HUESO(K,3) DEF_MAND(CONT_DEFMAND,4)=HUESO(K,4) DEF_MAND(CONT_DEFMAND,5)=HUESO(K,5) ENDIF ENDDO ENDIF ENDDO ENDDO C C C C CREA LA DEFINICIN DE ELEMENTOS DEL MAXSUP_Y_CRANEO. PARA ELLO, SE VA LEYENDO LA VARIABLE QUE CONTIENE EL GRUPO DE ELEMENTOS: "MAXSUP_Y_CRANEO", Y SE BUSCA LA DEFINICIN DE ESTOS EN "HUESO", DEFINIENDO "DEF_MSYC" CONT_DEFMSYC=0 DO I=1,CONT_MAXSUP_Y_CRANEO DO J=1,16 IF(MAXSUP_Y_CRANEO(I,J).NE.0.0)THEN DO K=1,CONT_HUESO IF(MAXSUP_Y_CRANEO(I,J).EQ.HUESO(K,1))THEN

132

Anexo III Rutinas para obtener los modelos de elementos finitos

CONT_DEFMSYC=CONT_DEFMSYC+1 DEF_MSYC(CONT_DEFMSYC,1)=HUESO(K,1) DEF_MSYC(CONT_DEFMSYC,2)=HUESO(K,2) DEF_MSYC(CONT_DEFMSYC,3)=HUESO(K,3) DEF_MSYC(CONT_DEFMSYC,4)=HUESO(K,4) DEF_MSYC(CONT_DEFMSYC,5)=HUESO(K,5) ENDIF ENDDO ENDIF ENDDO ENDDO C LOS ELEMENTOS DEL MAXILAR SUPERIOR Y EL CRANEO, SE REDEFINIRAN C CON LOS NODOS QUE SE HAYAN DUPLICADO. PARA ELLO SE GUARDA MEMORIA C DE LA VARIABLE: "DEF_MSYCMOD" ALLOCATE (DEF_MSYCMOD(CONT_DEFMSYC,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C COPIA DEF_MSYC EN DEF_MSYCMOD DO I=1,CONT_DEFMSYC DO J=1,5 DEF_MSYCMOD(I,J)=DEF_MSYC(I,J) ENDDO ENDDO C WRITE(*,*) 'Terminada definicin e inicio duplicacin' C C ALMACENA EN UN VECTOR COLUMNA "COMUNES" TODOS LOS NODOS COMUNES A LOS C GRUPOS DE NODOS: "NODOS_MAND" Y "NODOS_MSYC" AUX=0 DO I=1,CONT_NODOS_MAND DO J=1,16 IF(NODOS_MAND(I,J).NE.0.0)THEN DO K=1,CONT_NODOS_MSYC DO L=1,16 IF(NODOS_MAND(I,J).EQ.NODOS_MSYC(K,L))THEN AUX=AUX+1 COMUNES(AUX,1)=NODOS_MAND(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO C LOS C ALMACENA MEMORIA PARA LA VARIABLE QUE CONTIENE LA DEFINICIN DE NODOS COMUNES: "DEF_COMUNES" ALLOCATE (DEF_COMUNES(AUX,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

133

Anexo III Rutinas para obtener los modelos de elementos finitos

C LOS C

ALMACENA MEMORIA PARA LA VARIABLE QUE CONTIENE LA DEFINICIN DE NODOS DUPLICADOS: "DEF_DUPLICADOS" ALLOCATE (DEF_DUPLICADOS(AUX,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

C SELECCIONA LOS NODOS DEL VECTOR "COMUNES", DE ENTRE LA DEFINICIN C DE TODOS LOS NODOS EN "HPyH". PARA OBTENER LA DEFINICIN DE C LOS NODOS COMUNES "DEF_COMUNES" DO I=1,AUX DO J=1,CONT_NPyH IF(COMUNES(I,1).EQ.INT(NPyH(J,1)))THEN DO K=1,4 DEF_COMUNES(I,K)=NPyH(J,K) ENDDO EXIT ENDIF ENDDO ENDDO C DEFINE EL NUMERO DE NODO A PARTIR DEL CUAL SE COMIENZA LA DUPLICACIN INICIODEFINICION=700000 C SE DUPLICAN LOS NODOS DE LA VARIABLE "DEF_COMUNES", ALMACENANDOSE LOS C DUPLICADOS EN LA VARIABLE "DEF_DUPLICADOS" AUX2=INICIODEFINICION+1 DO I=1,AUX DEF_DUPLICADOS(I,1)=AUX2 AUX2=AUX2+1 ENDDO DO I=1,AUX DO K=2,4 DEF_DUPLICADOS(I,K)=DEF_COMUNES(I,K) ENDDO ENDDO C WRITE(*,*) 'Terminada duplicacin e inicio asignacin duplicados' C C C C C LECTURA ELTO A ELTO DE "DEF_MSYC" BUSCANDO ENTRE LOS NODOS QUE DEFINEN ESTOS ELEMENTOS, NODOS QUE PERTENEZCAN A "DEF_COMUNES" CDO SE ENCUENTRAN SE VA ACTUALIZANDO LA VBLE "DEF_MSYCMOD" CON LOS NODOS DUPLICADOS "DEF_DUPLICADOS" DO I=1,CONT_DEFMSYC DO K=1,AUX IF(INT(DEF_COMUNES(K,1)).EQ.DEF_MSYC(I,2))THEN DEF_MSYCMOD(I,2)=INT(DEF_DUPLICADOS(K,1)) ENDIF IF(INT(DEF_COMUNES(K,1)).EQ.DEF_MSYC(I,3))THEN DEF_MSYCMOD(I,3)=INT(DEF_DUPLICADOS(K,1)) ENDIF IF(INT(DEF_COMUNES(K,1)).EQ.DEF_MSYC(I,4))THEN

134

Anexo III Rutinas para obtener los modelos de elementos finitos

DEF_MSYCMOD(I,4)=INT(DEF_DUPLICADOS(K,1)) ENDIF IF(INT(DEF_COMUNES(K,1)).EQ.DEF_MSYC(I,5))THEN DEF_MSYCMOD(I,5)=INT(DEF_DUPLICADOS(K,1)) ENDIF ENDDO ENDDO C C C ESCRIBE LA DEFINICIN DE TODOS LOS NODOS DEL MODELO: "NPyH" + LA NUEVA DEFINICIN DE NODOS DUPLICADOS: "DEF_DUPLICADOS" OPEN (unit=101,file='NPyH2.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NODOS_PIELYHUESO' DO I=1,CONT_NPyH WRITE(101,11) INT(NPyH(I,1)),',',NPyH(I,2),',', 1NPyH(I,3),',',NPyH(I,4) ENDDO DO I=1,AUX WRITE(101,11) INT(DEF_DUPLICADOS(I,1)),',', 1DEF_DUPLICADOS(I,2),',',DEF_DUPLICADOS(I,3),',', 2DEF_DUPLICADOS(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) ESCRIBE LA DEFINICIN DE ELTOS DE MANDIBULA OPEN (unit=101,file='DEFMAND.inp',status='unknown') WRITE(101,*) '*ELEMENT,TYPE=C3D4,ELSET=MANDIBULA' DO I=1,CONT_DEFMAND WRITE(101,12) DEF_MAND(I,1),',',DEF_MAND(I,2),',', 1DEF_MAND(I,3),',',DEF_MAND(I,4),',',DEF_MAND(I,5) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) ESCRIBE LA DEFINICIN DE ELTOS DE MAXSUP Y CRANEO OPEN (unit=101,file='DEFMSYC.inp',status='unknown') WRITE(101,*) '*ELEMENT,TYPE=C3D4,ELSET=MAXSUP_Y_CRANEO' DO I=1,CONT_DEFMSYC WRITE(101,12) DEF_MSYCMOD(I,1),',',DEF_MSYCMOD(I,2),',', 1DEF_MSYCMOD(I,3),',',DEF_MSYCMOD(I,4),',',DEF_MSYCMOD(I,5) ENDDO CLOSE(unit=101,status='keep') END

11 C

12 C

135

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 11 % % "Movimiento_mandibula.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,EXITO,AUX INTEGER*4 CONT_NPyH REAL*4 NPyH_MAX(MAX,4),NPyH[ALLOCATABLE](:,:), 1NCOMP[ALLOCATABLE](:,:) INTEGER*4 CONT_NODOS_MAND,NODOS_MAND_MAX(MAX,16), 1NODOS_MAND[ALLOCATABLE](:,:) REAL*4 V(1,3),A(1,3),B(1,3),BETA,BETAR,AB(1,3),ABMODULO, 1ZP(1,3),TS,PI REAL*4 DNM(MAX,4),TI[ALLOCATABLE](:,:),T[ALLOCATABLE](:,:), 1S[ALLOCATABLE](:,:),SP[ALLOCATABLE](:,:), 2SPMODULO[ALLOCATABLE](:,:),XP[ALLOCATABLE](:,:), 3YP[ALLOCATABLE](:,:),DPL[ALLOCATABLE](:,:),DP[ALLOCATABLE](:,:), 4N[ALLOCATABLE](:,:),R[ALLOCATABLE](:,:),G[ALLOCATABLE](:,:), 5PL[ALLOCATABLE](:,:) C C C LEE LOS NODOS DEL ARCHIVO NPyH2.txt Y LOS GUARDA EN LA VARIABLE "NPyH". EL ARCHIVO DESDE EL QUE SE LEE "NPyH2" TIENE LA DEFINICIN DE NODOS TRAS SEPARAR LA MANDBULA. OPEN (unit=101,file='C:\FORTRAN\NPyH2.inp',status='unknown') CONT_NPyH=0 DO I=1,MAX READ(101,*,END=14) (NPyH_MAX(I,J),J=1,4) CONT_NPyH=CONT_NPyH+1 ENDDO 14 WRITE(*,*) 'Terminada lectura de nodos',CONT_NPyH, 2'FILAS NPyH' CLOSE(unit=101,status='keep') ALLOCATE (NPyH(CONT_NPyH,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NPyH NPyH(I,1:4)=NPyH_MAX(I,1:4) ENDDO ALLOCATE (NCOMP(CONT_NPyH,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NPyH NCOMP(I,1:4)=NPyH_MAX(I,1:4) ENDDO C LEE LOS NODOS DEL ARCHIVO NODOS_MAND.inp Y LOS GUARDA EN LA

136

Anexo III Rutinas para obtener los modelos de elementos finitos

VARIABLE "NODOS_MAND". OPEN (unit=101,file='C:\FORTRAN\NODOS_MAND.inp',status='unknown') CONT_NODOS_MAND=0 DO I=1,MAX READ(101,*,END=15) (NODOS_MAND_MAX(I,J),J=1,16) CONT_NODOS_MAND=CONT_NODOS_MAND+1 ENDDO 15 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS_MAND, 1'FILAS NODOS_MAND' CLOSE(unit=101,status='keep') ALLOCATE (NODOS_MAND(CONT_NODOS_MAND,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS_MAND NODOS_MAND(I,1:16)=NODOS_MAND_MAX(I,1:16) ENDDO C WRITE(*,*) 'Terminada lectura vbles e inicio definicin nodos 1mandbula' C C SELECCIONA LOS NODOS DEL VECTOR "NODOS_MAND", DE ENTRE LA DEFINICIN C DE TODOS LOS NODOS EN "HPyH". PARA OBTENER LA DEFINICIN DE C LOS NODOS DE LA MANDBULA "DNM" AUX=0 DO I=1,CONT_NODOS_MAND DO J=1,16 IF(NODOS_MAND(I,J).NE.0.0)THEN DO K=1,CONT_NPyH IF(NODOS_MAND(I,J).EQ.INT(NPyH(K,1)))THEN AUX=AUX+1 DO L=1,4 DNM(AUX,L)=NPyH(K,L) ENDDO EXIT ENDIF ENDDO ENDIF ENDDO ENDDO WRITE(*,*) 'AUX',AUX ALLOCATE (TI(AUX,1),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (T(AUX,1),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

137

Anexo III Rutinas para obtener los modelos de elementos finitos

ALLOCATE (S(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (SP(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (SPMODULO(AUX,1),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (XP(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (YP(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (G(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (PL(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (DPL(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (DP(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (N(AUX,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (R(AUX,3),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C WRITE(*,*) 'Terminada definicin nodos mandbula e inicio def 1movimiento' C

138

Anexo III Rutinas para obtener los modelos de elementos finitos

VECTOR TRASLACIN V(1,1)=0 V(1,2)=0 V(1,3)=0 DOS PUNTOS QUE DEFINEN EL EJE DE ROTACIN A(1,1)=0.0457219779491425 A(1,2)=0.133177503943443 A(1,3)=0.136721208691597 B(1,1)=0.127031192183495 B(1,2)=0.130933851003647 B(1,3)=0.136469513177872 NGULO EN DECIMALES BETA=15 TS=360 PI=3.14159265 BETAR=BETA*2*PI/TS

C C WRITE(*,*) 'Terminada definicin movimiento e inicio movimiento' C C VECTOR AB (ES EL QUE DEFINE EL EJE) AB(1,1)=B(1,1)-A(1,1) AB(1,2)=B(1,2)-A(1,2) AB(1,3)=B(1,3)-A(1,3) VECTOR AB UNITARIO: "ZP" Z PRIMA ABMODULO=SQRT(AB(1,1)**2+AB(1,2)**2+AB(1,3)**2) ZP(1,1)=AB(1,1)/ABMODULO ZP(1,2)=AB(1,2)/ABMODULO ZP(1,3)=AB(1,3)/ABMODULO DO I=1,AUX TERMINO INDEPENDIENTE DE UN PLANO PERPENDICULAR AL VECTOR "AB" QUE PASA POR NODO "DNM(I,1)" TI(I,1)=ZP(1,1)*DNM(I,2)+ZP(1,2)*DNM(I,3)+ZP(1,3)*DNM(I,4) RECTA AB EN IMPLCITAS, SE INTRODUCE EN LA ECUACIN DEL PLANO DESPEJAR EL PARMETRO "T" X=A(1,1)+AB(1,1)*T Y=A(1,2)+AB(1,2)*T Z=A(1,3)+AB(1,3)*T

C C C C PARA C C C C

T(I,1)=(TI(I,1)-ZP(1,1)*A(1,1)-ZP(1,2)*A(1,2)-ZP(1,3)*A(1,3))/ 1(ZP(1,1)**2+ZP(1,2)**2+ZP(1,3)**2) C RESOLVIENDO EL SISTEMA DE 3ECS CON 3INC QUE FORMAN LAS DOS C ECUACIONES DE LA RECTA Y EL PLANO. SE OBTIENE LA INTERSECCIN DE AMBOS. C SE LLAMA AL PUNTO INTERSECCIN "S" S(I,1)=A(1,1)+ZP(1,1)*T(I,1) S(I,2)=A(1,2)+ZP(1,2)*T(I,1) S(I,3)=A(1,3)+ZP(1,3)*T(I,1) C VECTOR SP DEFINE OTRO EJE LOCAL. STE CONTENIDO EN EL PLANO CALCULADO C ANTERIORMENTE. P SE REFIERE AL PUNTO QUE SE TRABAJE (NODO DEL BUCLE) SP(I,1)=DNM(I,2)-S(I,1) SP(I,2)=DNM(I,3)-S(I,2)

139

Anexo III Rutinas para obtener los modelos de elementos finitos

SP(I,3)=DNM(I,4)-S(I,3) C VECTOR SP UNITARIO: "XP" X PRIMA SPMODULO(I,1)=SQRT(SP(I,1)**2+SP(I,2)**2+SP(I,3)**2) XP(I,1)=SP(I,1)/SPMODULO(I,1) XP(I,2)=SP(I,2)/SPMODULO(I,1) XP(I,3)=SP(I,3)/SPMODULO(I,1) PRODUCTO VECTORIAL DE ZP SOBRE XP DEFINE EL TERCER EJE LOCAL: ESTE VECTOR ES UNITARIO, YA QUE ZP Y XP LO SON Y FORMAN 90 YP(I,1)=(ZP(1,2)*XP(I,3))-(ZP(1,3)*XP(I,2)) YP(I,2)=-(ZP(1,1)*XP(I,3))+(ZP(1,3)*XP(I,1)) YP(I,3)=(ZP(1,1)*XP(I,2))-(ZP(1,2)*XP(I,1)) EL MODULO DEL VECTOR "SP" ES EL RADIO DE GIRO ENTORNO AL EJE. ESTE GIRO SE DEFINE COMO: G(I,1)=SPMODULO(I,1)*COS(BETAR) G(I,2)=SPMODULO(I,1)*SIN(BETAR) G(I,3)=0 P (COORDENADAS NODO) EN LOCALES: PL(I,1)=SPMODULO(I,1) PL(I,2)=0 PL(I,3)=0 INCREMENTO P EN LOCALES: DPL(I,1)=G(I,1)-PL(I,1) DPL(I,2)=G(I,2)-PL(I,2) DPL(I,3)=G(I,3)-PL(I,3) INCREMENTO DE P EN GLOBALES: "DP" DP(I,1)=(XP(I,1)*DPL(I,1))+(YP(I,1)*DPL(I,2)) DP(I,2)=(XP(I,2)*DPL(I,1))+(YP(I,2)*DPL(I,2)) DP(I,3)=(XP(I,3)*DPL(I,1))+(YP(I,3)*DPL(I,2)) LAS NUEVAS COORDENADAS "N" DEL PUNTO GIRADO "DP" ES EL INCREMENTO DEBIDO AL GIRO "V" ES EL INCREMENTO DEBIDO A LA TRASLACIN N(I,1)=DNM(I,1) N(I,2)=DNM(I,2)+DP(I,1)+V(1,1) N(I,3)=DNM(I,3)+DP(I,2)+V(1,2) N(I,4)=DNM(I,4)+DP(I,3)+V(1,3) LOS INCREMENTOS "R" PARA ESCRIBIR LAS CC: R(I,1)=DP(I,1)+V(1,1) R(I,2)=DP(I,2)+V(1,2) R(I,3)=DP(I,3)+V(1,3) ENDDO C WRITE(*,*) 'Comprobacin' C C C C C LA EL EN LA COMPROBACIN DEVUELVE LA DEFINICIN DE MOVIMIENTO IMPUESTO A LA MANDBULA. DE ABAQUS CAE SE COMPRUEBE QUE EL GIRO SE NUEVA DEFINICIN DE "NPyH" SE OBTENDR NODOS: NPyH CON MANERA QUE AL CARGARLO REALIZA CON EXITO. EN "NCOMP" SON:

C "YP" C

C C

C C C

140

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,AUX DO J=1,CONT_NPyH IF(INT(N(I,1)).EQ.INT(NPyH(J,1)))THEN DO K=2,4 NCOMP(J,K)=N(I,K) ENDDO EXIT ENDIF ENDDO ENDDO C WRITE(*,*) 'Fin movimiento. Inicio escritura resultados' C C C ESCRIBE LAS CONDICIONES DE CONTORNO, PARA IMPONER EL MOVIMIENTO REALIZADO A LA MANDBULA. OPEN (unit=101,file='CCMAND.inp',status='unknown') DO I=1,AUX WRITE(101,11) INT(N(I,1)),',',1,',',1,',',R(I,1) WRITE(101,11) INT(N(I,1)),',',2,',',2,',',R(I,2) WRITE(101,11) INT(N(I,1)),',',3,',',3,',',R(I,3) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,I8,A1,I8,A1,E16.8) ESCRIBE LA DEFINICIN DE NODOS PARA COMPROBACIN OPEN (unit=101,file='NCOMP.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NODOS_PIELYHUESO' DO I=1,CONT_NPyH WRITE(101,12) INT(NCOMP(I,1)),',',NCOMP(I,2),',', 1NCOMP(I,3),',',NCOMP(I,4) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) END

11 C

12

141

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 12 % % "Obtener_modelo_plano.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este cdigo permite seleccionar una de las caras de los elementos hexadricos que forman el modelo 2D recin exportado. Formando, por tanto, un modelo 2D real con elementos planos de forma cuadrada.

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,EXITO,CONT INTEGER*4 CONT_NODOSP,CONT_ELHUESO,CONT_ELPIEL,CONT_NODOSDEF, 1CONT_EHDEF,CONT_EPDEF REAL*4 NODOSP_MAX(MAX,4),NODOSP[ALLOCATABLE](:,:), 1NODOSDEF_MAX[ALLOCATABLE](:,:),NODOSDEF[ALLOCATABLE](:,:) INTEGER*4 ELHUESO_MAX(MAX,5),ELHUESO[ALLOCATABLE](:,:), 1ELPIEL_MAX(MAX,5),ELPIEL[ALLOCATABLE](:,:), 2AUX_ELHUESO[ALLOCATABLE](:,:),AUX_ELPIEL[ALLOCATABLE](:,:), 3ELHUESODEF[ALLOCATABLE](:,:),ELPIELDEF[ALLOCATABLE](:,:), 4INI_HUESO,INI_PIEL

C C

LEE LOS NODOS DEL ARCHIVO NODOSP.txt Y LOS GUARDA EN LA VARIABLE CON EL MISMO NOMBRE OPEN (unit=101,file='C:\FORTRAN\NODOSP.txt',status='unknown') CONT_NODOSP=0 DO I=1,MAX READ(101,*,END=16) (NODOSP_MAX(I,J),J=1,4) CONT_NODOSP=CONT_NODOSP+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOSP, 1'FILAS NODOSP' CLOSE(unit=101,status='keep') ALLOCATE (NODOSP(CONT_NODOSP,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOSP NODOSP(I,1:4)=NODOSP_MAX(I,1:4) ENDDO

C LEE LOS ELEMENTOS TIPO PLANOS DEL ARCHIVO ELHUESO.txt Y LOS GUARDA EN LA VARIABLE C CON EL MISMO NOMBRE OPEN (unit=101,file='C:\FORTRAN\ELHUESO.txt',status='unknown') CONT_ELHUESO=0 DO I=1,MAX READ(101,*,END=17) (ELHUESO_MAX(I,J),J=1,5) CONT_ELHUESO=CONT_ELHUESO+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_ELHUESO, 1'FILAS ELHUESO'

142

Anexo III Rutinas para obtener los modelos de elementos finitos

CLOSE(unit=101,status='keep') ALLOCATE (ELHUESO(CONT_ELHUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ELHUESO ELHUESO(I,1:5)=ELHUESO_MAX(I,1:5) ENDDO C LEE LOS ELEMENTOS TIPO PLANOS DEL ARCHIVO ELPIEL.txt Y LOS GUARDA EN LA VARIABLE C CON EL MISMO NOMBRE OPEN (unit=101,file='C:\FORTRAN\ELPIEL.txt',status='unknown') CONT_ELPIEL=0 DO I=1,MAX READ(101,*,END=18) (ELPIEL_MAX(I,J),J=1,5) CONT_ELPIEL=CONT_ELPIEL+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',CONT_ELPIEL, 1'FILAS ELPIEL' CLOSE(unit=101,status='keep') ALLOCATE (ELPIEL(CONT_ELPIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ELPIEL ELPIEL(I,1:5)=ELPIEL_MAX(I,1:5) ENDDO CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C SER C ALMACENA MEMORIA PARA UNA VARIABLE DEL MISMO TAMAO QUE NODOSP, A LA QUE LLAMAREMOS NODOSDEF_MAX, AUNQUE LA CAPACIDAD DE ESTA NO COMPLETADA ALLOCATE (NODOSDEF_MAX(CONT_NODOSP,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF

C COPIA LA DEFINICIN DE LOS NODOS QUE TENGAN EN SU PRIMERA COMPONENTE EL C VALOR DE 0.001 EN LA VARIABLE NODOSDEF_MAX. CONT_NODOSDEF=0 DO I=1,CONT_NODOSP IF(NODOSP(I,2).EQ.0.001)THEN CONT_NODOSDEF=CONT_NODOSDEF+1 DO J=1,4 NODOSDEF_MAX(CONT_NODOSDEF,J)=NODOSP(I,J) ENDDO ENDIF ENDDO C ALMACENA MEMORIA PARA NODOSDEF Y SE ESCRIBE LA MISMA CON EL CONTENIDO DE

143

Anexo III Rutinas para obtener los modelos de elementos finitos

NODOSDEF_MAX ALLOCATE (NODOSDEF(CONT_NODOSDEF,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOSDEF NODOSDEF(I,1:4)=NODOSDEF_MAX(I,1:4) ENDDO WRITE(*,*) 'PRUEBA1' CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C SE DEFINE UNA VARIABLE AUXILIAR IDENTICA A "ELHUESO" PERO CON UNA COLUMNA C MS AL FINAL, PUESTA EN CERO. LA LLAMAREMOS "AUX_ELHUESO". ALLOCATE (AUX_ELHUESO(CONT_ELHUESO,6),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ELHUESO AUX_ELHUESO(I,1:5)=ELHUESO(I,1:5) AUX_ELHUESO(I,6)=0 ENDDO C ENTRE LOS ELEMENTOS PLANOS DEL HUESO SE SELECCIONAN AQUELLOS QUE ESTAN C FORMADOS POR CUATRO NODOS DE LOS DEFINIDOS EN NODOSDEF. LA SELECCIN SE C HAR HACIENDO "1" LA SEXTA COLUMNA DE "AUX_ELHUESO" DO I=1,CONT_ELHUESO CONT=0 DO J=2,5 DO K=1,CONT_NODOSDEF IF(ELHUESO(I,J).EQ.INT(NODOSDEF(K,1)))THEN CONT=CONT+1 ENDIF ENDDO IF(CONT.EQ.4)THEN AUX_ELHUESO(I,6)=1 ENDIF ENDDO ENDDO C ALMACENA MEMORIA PARA LA VARIABLE DEFINITIVA QUE TIENE LOS ELEMENTOS C PLANOS DEL GRUPO HUESO. "ELHUESODEF". ALLOCATE (ELHUESODEF(40000,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C BUSCA LOS ELEMENTOS DE "AUX_ELHUESO" QUE TIENEN UN "1" EN SU SEXTA C COLUMNA. ESTOS SON ESCRITOS A PARTIR DEL ELEMENTO 50001, EN LA VARIABLE C QUE CONTENDR LOS ELEMENTOS PLANOS DEFINITIVOS DEL GRUPO HUESO. INI_HUESO=50000 CONT_EHDEF=0 DO I=1,CONT_ELHUESO IF(AUX_ELHUESO(I,6).EQ.1)THEN

144

Anexo III Rutinas para obtener los modelos de elementos finitos

INI_HUESO=INI_HUESO+1 CONT_EHDEF=CONT_EHDEF+1 ELHUESODEF(CONT_EHDEF,1)=INI_HUESO ELHUESODEF(CONT_EHDEF,2:5)=AUX_ELHUESO(I,2:5) ENDIF ENDDO WRITE(*,*) 'PRUEBA2' CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C SE DEFINE UNA VARIABLE AUXILIAR IDENTICA A "ELPIEL" PERO CON UNA COLUMNA C MS AL FINAL, PUESTA EN CERO. LA LLAMAREMOS "AUX_ELPIEL". ALLOCATE (AUX_ELPIEL(CONT_ELPIEL,6),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ELPIEL AUX_ELPIEL(I,1:5)=ELPIEL(I,1:5) AUX_ELPIEL(I,6)=0 ENDDO C ENTRE LOS ELEMENTOS PLANOS DE LA VBLE PIEL SE SELECCIONAN AQUELLOS QUE ESTAN C FORMADOS POR CUATRO NODOS DE LOS DEFINIDOS EN NODOSDEF. LA SELECCIN SE C HAR HACIENDO "1" LA SEXTA COLUMNA DE "AUX_ELPIEL" DO I=1,CONT_ELPIEL CONT=0 DO J=2,5 DO K=1,CONT_NODOSDEF IF(ELPIEL(I,J).EQ.INT(NODOSDEF(K,1)))THEN CONT=CONT+1 ENDIF ENDDO IF(CONT.EQ.4)THEN AUX_ELPIEL(I,6)=1 ENDIF ENDDO ENDDO C ALMACENA MEMORIA PARA LA VARIABLE DEFINITIVA QUE TIENE LOS ELEMENTOS C PLANOS DEL GRUPO PIEL. "ELPIELDEF". ALLOCATE (ELPIELDEF(40000,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C BUSCA LOS ELEMENTOS DE "AUX_ELPIEL" QUE TIENEN UN "1" EN SU SEXTA C COLUMNA. ESTOS SON ESCRITOS A PARTIR DEL ELEMENTO 1, EN LA VARIABLE C QUE CONTENDR LOS ELEMENTOS PLANOS DEFINITIVOS DEL GRUPO PIEL. INI_PIEL=0 CONT_EPDEF=0 DO I=1,CONT_ELPIEL IF(AUX_ELPIEL(I,6).EQ.1)THEN INI_PIEL=INI_PIEL+1 CONT_EPDEF=CONT_EPDEF+1

145

Anexo III Rutinas para obtener los modelos de elementos finitos

ELPIELDEF(CONT_EPDEF,1)=INI_PIEL ELPIELDEF(CONT_EPDEF,2:5)=AUX_ELPIEL(I,2:5) ENDIF ENDDO CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ESCRIBE EL MODELO SAGITAL FORMADO POR ELEMENTOS PLANOS DE 4 NODOS OPEN (unit=101,file='MODELO_SAGITAL.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NODOS' DO I=1,CONT_NODOSDEF WRITE(101,20) INT(NODOSDEF(I,1)),',',NODOSDEF(I,2),',',NODOSDEF(I,3), 1 ',',NODOSDEF(I,4) ENDDO WRITE(101,*) '*ELEMENT,TYPE=S4,ELSET=PIEL' DO I=1,CONT_EPDEF WRITE(101,21) ELPIELDEF(I,1),',',ELPIELDEF(I,2),',',ELPIELDEF(I,3), 1 ',',ELPIELDEF(I,4),',',ELPIELDEF(I,5) ENDDO WRITE(101,*) '*ELEMENT,TYPE=S4,ELSET=HUESO' DO I=1,CONT_EHDEF WRITE(101,21) ELHUESODEF(I,1),',',ELHUESODEF(I,2),',',ELHUESODEF(I,3), 1 ',',ELHUESODEF(I,4),',',ELHUESODEF(I,5) ENDDO CLOSE(unit=101,status='keep') 20 FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) 21 FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) END

146

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 12 % % "Separar_comisura2D.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Esta rutina crea la comisura del modelo bidimensional de eltos planos.

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,M,AUX,EXITO,CONT_NTODO,INICIODEFINICION,AUX2 REAL*4 NTODO_MAX(MAX,4),NTODO[ALLOCATABLE](:,:), 1DEFCOMUNES(10000,4),NDUPL(10000,4) INTEGER*4 CONT_NODOSINF,NODOSINF_MAX(MAX,16), 1NODOSINF[ALLOCATABLE](:,:), 2CONT_NODOSUP,NODOSUP_MAX(MAX,16),NODOSUP[ALLOCATABLE](:,:), 3CONT_LABINF,LABINF_MAX(MAX,16),LABINF[ALLOCATABLE](:,:), 4CONT_LABSUP,LABSUP_MAX(MAX,16),LABSUP[ALLOCATABLE](:,:), 5CONT_ETODO,ETODO_MAX(MAX,5),ETODO[ALLOCATABLE](:,:), 6CONT_HUESO,HUESO_MAX(MAX,5),HUESO[ALLOCATABLE](:,:), 7ETODOMOD[ALLOCATABLE](:,:), 8NCOMUN(10000,1)

C C

LEE LOS NODOS DEL ARCHIVO NODOSINF.txt Y LOS GUARDA EN LA VARIABLE "NODOSINF". OPEN (unit=101,file='C:\FORTRAN\NODOSINF.txt',status='unknown') CONT_NODOSINF=0 DO I=1,MAX READ(101,*,END=16) (NODOSINF_MAX(I,J),J=1,16) CONT_NODOSINF=CONT_NODOSINF+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOSINF, 1'FILAS NODOSINF' CLOSE(unit=101,status='keep') ALLOCATE (NODOSINF(CONT_NODOSINF,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOSINF NODOSINF(I,1:16)=NODOSINF_MAX(I,1:16) ENDDO

C C

LEE LOS NODOS DEL ARCHIVO NODOSUP.txt Y LOS GUARDA EN LA VARIABLE "NODOSUP". OPEN (unit=101,file='C:\FORTRAN\NODOSUP.txt',status='unknown') CONT_NODOSUP=0 DO I=1,MAX READ(101,*,END=17) (NODOSUP_MAX(I,J),J=1,16) CONT_NODOSUP=CONT_NODOSUP+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOSUP, 1'FILAS NODOSUP' CLOSE(unit=101,status='keep')

147

Anexo III Rutinas para obtener los modelos de elementos finitos

ALLOCATE (NODOSUP(CONT_NODOSUP,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOSUP NODOSUP(I,1:16)=NODOSUP_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NTODO.txt Y LOS GUARDA EN LA VARIABLE "NTODO". OPEN (unit=101,file='C:\FORTRAN\NTODO.txt',status='unknown') CONT_NTODO=0 DO I=1,MAX READ(101,*,END=18) (NTODO_MAX(I,J),J=1,4) CONT_NTODO=CONT_NTODO+1 ENDDO 18 WRITE(*,*) 'Terminada lectura de nodos',CONT_NTODO,'FILAS NTODO' CLOSE(unit=101,status='keep') ALLOCATE (NTODO(CONT_NTODO,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NTODO NTODO(I,1:4)=NTODO_MAX(I,1:4) ENDDO C C C LEE EL GRUPO DE ELEMENTOS DEL LABIO SUPERIOR DEL ARCHIVO LABSUP.txt Y LOS GUARDA EN LA VARIABLE "LABSUP" ESTE GRUPO TIENE LOS ELEMENTOS DEL LABIO SUPERIOR HACIA ARRIBA

OPEN (unit=101,file='C:\FORTRAN\LABSUP.txt',status='unknown') CONT_LABSUP=0 DO I=1,MAX READ(101,*,END=19) (LABSUP_MAX(I,J),J=1,16) CONT_LABSUP=CONT_LABSUP+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de nodos',CONT_LABSUP,'FILAS LABSUP' CLOSE(unit=101,status='keep') ALLOCATE (LABSUP(CONT_LABSUP,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_LABSUP LABSUP(I,1:16)=LABSUP_MAX(I,1:16) ENDDO C C C LEE EL GRUPO DE ELEMENTOS DEL LABIO INFERIOR DEL ARCHIVO LABINF.txt Y LOS GUARDA EN LA VARIABLE "LABINF" ESTE GRUPO TIENE LOS ELEMENTOS DEL LABIO INFERIOR HACIA ABAJO OPEN (unit=101,file='C:\FORTRAN\LABINF.txt',status='unknown') CONT_LABINF=0 DO I=1,MAX READ(101,*,END=20) (LABINF_MAX(I,J),J=1,16)

148

Anexo III Rutinas para obtener los modelos de elementos finitos

CONT_LABINF=CONT_LABINF+1 ENDDO 20 WRITE(*,*) 'Terminada lectura de nodos',CONT_LABINF,'FILAS LABINF' CLOSE(unit=101,status='keep') ALLOCATE (LABINF(CONT_LABINF,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_LABINF LABINF(I,1:16)=LABINF_MAX(I,1:16) ENDDO C C C LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO ETODO.txt Y LOS ALMACENA EN LA VARIABLE "ETODO" SE ASIGNA DIMENSIONES A LA VARIABLE "ETODOMOD" OPEN (unit=101,file='C:\FORTRAN\ETODO.txt',status='unknown') CONT_ETODO=0 DO I=1,MAX READ(101,*,END=21) (ETODO_MAX(I,J),J=1,5) CONT_ETODO=CONT_ETODO+1 ENDDO 21 WRITE(*,*) 'Terminada lectura de nodos',CONT_ETODO,'FILAS ETODO' CLOSE(unit=101,status='keep') ALLOCATE (ETODO(CONT_ETODO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_ETODO ETODO(I,1:5)=ETODO_MAX(I,1:5) ENDDO ALLOCATE (ETODOMOD(CONT_ETODO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C LEE LA DEFINICIN DE ELEMENTOS DEL ARCHIVO HUESO.txt Y LOS ALMACENA EN LA VARIABLE "HUESO" OPEN (unit=101,file='C:\FORTRAN\HUESO.txt',status='unknown') CONT_HUESO=0 DO I=1,MAX READ(101,*,END=22) (HUESO_MAX(I,J),J=1,5) CONT_HUESO=CONT_HUESO+1 ENDDO 22 WRITE(*,*) 'Terminada lectura de nodos',CONT_HUESO,'FILAS HUESO' CLOSE(unit=101,status='keep') ALLOCATE (HUESO(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO(I,1:5)=HUESO_MAX(I,1:5) ENDDO

149

Anexo III Rutinas para obtener los modelos de elementos finitos

C C

ALMACENA EN UN VECTOR COLUMNA (VBLE "NCOMUN") TODOS LOS NODOS COMUNES A NODOSINF Y NODOSUP AUX=0 DO I=1,CONT_NODOSUP DO J=1,16 IF(NODOSUP(I,J).NE.0.0)THEN DO K=1,CONT_NODOSINF DO L=1,16 IF(NODOSUP(I,J).EQ.NODOSINF(K,L))THEN AUX=AUX+1 NCOMUN(AUX,1)=NODOSUP(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO

C C C C

SELECCIONA LOS NODOS DEL VECTOR NCOMUN, DE ENTRE LA DEFINICION DE TODOS LOS NODOS DE LA VARIABLE (NTODO) PARA OBTENER LA DEFINICION DE NODOS COMUNES ALMACENANDOLA EN "DEFCOMUNES" DO I=1,AUX DO J=1,CONT_NTODO IF(NCOMUN(I,1).EQ.INT(NTODO(J,1)))THEN DO K=1,4 DEFCOMUNES(I,K)=NTODO(J,K) ENDDO EXIT ENDIF ENDDO ENDDO

C DEFINE EL NUMERO DE NODO A PARTIR DEL CUAL SE COMIENZA LA DUPLICACIN INICIODEFINICION=100000 C LOS C SE DUPLICAN LOS NODOS DE LA VARIABLE "DEFCOMUNES", ALMACENANDOSE DUPLICADOS EN LA VARIABLE "NDUPL" AUX2=INICIODEFINICION+1 DO I=1,AUX NDUPL(I,1)=AUX2 AUX2=AUX2+1 ENDDO DO I=1,AUX DO K=2,4 NDUPL(I,K)=DEFCOMUNES(I,K) ENDDO ENDDO COPIA DE "ETODO" EN LA VBLE "ETODOMOD" DO I=1,CONT_ETODO DO J=1,5 ETODOMOD(I,J)=ETODO(I,J)

150

Anexo III Rutinas para obtener los modelos de elementos finitos

ENDDO ENDDO C LECTURA ELTO A ELTO DEL GRUPO "LABINF", LEYENDO DEFINICIN EN "ETODO", C SE BUSCAN DE ENTRE LOS NODOS QUE DEFINEN ESTOS ELEMENTOS C IGUALES A LOS DE NCOMUN. C CDO SE ENCUENTRA SE VA ACTUALIZANDO LA VBLE "ETODOMOD" CON LOS NODOS C DUPLICADOS DO I=1,CONT_LABINF DO J=1,16 IF(LABINF(I,J).NE.0.0)THEN DO K=1,CONT_ETODO IF(LABINF(I,J).EQ.ETODOMOD(K,1))THEN DO L=1,AUX IF(NCOMUN(L,1).EQ.ETODOMOD(K,2))THEN ETODOMOD(K,2)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,3))THEN ETODOMOD(K,3)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,4))THEN ETODOMOD(K,4)=INT(NDUPL(L,1)) ENDIF IF(NCOMUN(L,1).EQ.ETODOMOD(K,5))THEN ETODOMOD(K,5)=INT(NDUPL(L,1)) ENDIF ENDDO ENDIF ENDDO ENDIF ENDDO ENDDO C ESCRIBE EL ARCHIVO .inp RESULTANTE CON LOS LABIOS SEPARADOS. OPEN (unit=101,file='2D_LABIOS_SEPARADOS.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NODOS' DO I=1,CONT_NTODO WRITE(101,27) INT(NTODO(I,1)),',',NTODO(I,2),',',NTODO(I,3), 1 ',',NTODO(I,4) ENDDO DO I=1,AUX WRITE(101,27) INT(NDUPL(I,1)),',',NDUPL(I,2),',',NDUPL(I,3), 1 ',',NDUPL(I,4) ENDDO WRITE(101,*) '*ELEMENT,TYPE=CPE4H,ELSET=PIEL'

151

Anexo III Rutinas para obtener los modelos de elementos finitos

DO I=1,CONT_ETODO WRITE(101,28) ETODOMOD(I,1),',',ETODOMOD(I,2),',',ETODOMOD(I,3), 1 ',',ETODOMOD(I,4),',',ETODOMOD(I,5) ENDDO WRITE(101,*) '*ELEMENT,TYPE=S4,ELSET=HUESO' DO I=1,CONT_HUESO WRITE(101,28) HUESO(I,1),',',HUESO(I,2),',',HUESO(I,3), 1 ',',HUESO(I,4),',',HUESO(I,5) ENDDO CLOSE(unit=101,status='keep') 27 FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) 28 FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) C C ESCRIBE EL VECTOR "NCOMUN", CON LOS NODOS QUE FINALMENTE SE HAN ASOCIADO A ELEMENTOS DEL LABIO SUPERIOR OPEN (unit=101,file='NCOMISURASUP.txt',status='unknown') DO I=1,AUX WRITE(101,29) NCOMUN(I,1) ENDDO CLOSE(unit=101,status='keep') FORMAT(I8) ESCRIBE EL GRUPO DE NODOS DUPLICADOS, DE NODOS ASOCIADO A ELEMENTOS DEL LABIO INFERIOR OPEN (unit=101,file='NCOMISURAINF.txt',status='unknown') DO I=1,AUX WRITE(101,29) INT(NDUPL(I,1)) ENDDO CLOSE(unit=101,status='keep') END

29 C C

152

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C C C C C

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cdigo 13 % % "Comunes_y_duplica2D.for" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Este programa crea el vestbulo del modelo 2D de elementos planos, una vez se ha realizado sobre este la separacin de los labios.

PROGRAM LECTURA INTEGER*4,PARAMETER:: MAX=1000000 INTEGER*4 I,J,K,L,AUX,AUX2,AUX3,EXITO,CONT_NODOS2, 1INICIODEFINICION REAL*4 NODOS2_MAX(MAX,4),NODOS2[ALLOCATABLE](:,:), 1DEF_NVEST[ALLOCATABLE](:,:),NDUPL[ALLOCATABLE](:,:) INTEGER*4 CONT_NPIEL,NPIEL_MAX(MAX,16),NPIEL[ALLOCATABLE](:,:), 1CONT_NHUESO,NHUESO_MAX(MAX,16),NHUESO[ALLOCATABLE](:,:), 2CONT_HUESO,HUESO_MAX(MAX,5),HUESO[ALLOCATABLE](:,:), 3CONT_NAUX_VEST,NAUX_VEST_MAX(MAX,16),NAUX_VEST[ALLOCATABLE](:,: ), 4CONT_PIEL,PIEL_MAX(MAX,5),PIEL[ALLOCATABLE](:,:), 5COMUNES(100000,1), 6NVEST(100000,1), 7HUESO2[ALLOCATABLE](:,:) C C LEE LOS NODOS DEL ARCHIVO NAUX_VEST.txt Y LOS GUARDA EN LA VARIABLE "NAUX_VEST". OPEN (unit=101,file='C:\FORTRAN\NAUX_VEST.txt',status='unknown') CONT_NAUX_VEST=0 DO I=1,MAX READ(101,*,END=14) (NAUX_VEST_MAX(I,J),J=1,16) CONT_NAUX_VEST=CONT_NAUX_VEST+1 ENDDO 14 WRITE(*,*) 'Terminada lectura de nodos',CONT_NAUX_VEST, 2'FILAS NAUX_VEST' CLOSE(unit=101,status='keep') ALLOCATE (NAUX_VEST(CONT_NAUX_VEST,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NAUX_VEST NAUX_VEST(I,1:16)=NAUX_VEST_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NPIEL.txt Y LOS GUARDA EN LA VARIABLE "NPIEL". OPEN (unit=101,file='C:\FORTRAN\NPIEL.txt',status='unknown') CONT_NPIEL=0 DO I=1,MAX READ(101,*,END=15) (NPIEL_MAX(I,J),J=1,16) CONT_NPIEL=CONT_NPIEL+1 ENDDO 15 WRITE(*,*) 'Terminada lectura de nodos',CONT_NPIEL,'FILAS NPIEL' CLOSE(unit=101,status='keep') ALLOCATE (NPIEL(CONT_NPIEL,16),STAT=EXITO)

153

Anexo III Rutinas para obtener los modelos de elementos finitos

IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NPIEL NPIEL(I,1:16)=NPIEL_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NHUESO.txt Y LOS GUARDA EN LA VARIABLE "NHUESO". OPEN (unit=101,file='C:\FORTRAN\NHUESO.txt',status='unknown') CONT_NHUESO=0 DO I=1,MAX READ(101,*,END=16) (NHUESO_MAX(I,J),J=1,16) CONT_NHUESO=CONT_NHUESO+1 ENDDO 16 WRITE(*,*) 'Terminada lectura de nodos',CONT_NHUESO,'FILAS NHUESO' CLOSE(unit=101,status='keep') ALLOCATE (NHUESO(CONT_NHUESO,16),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NHUESO NHUESO(I,1:16)=NHUESO_MAX(I,1:16) ENDDO C C LEE LOS NODOS DEL ARCHIVO NODOS2.txt Y LOS GUARDA EN LA VARIABLE "NODOS2". OPEN (unit=101,file='C:\FORTRAN\NODOS2.txt',status='unknown') CONT_NODOS2=0 DO I=1,MAX READ(101,*,END=17) (NODOS2_MAX(I,J),J=1,4) CONT_NODOS2=CONT_NODOS2+1 ENDDO 17 WRITE(*,*) 'Terminada lectura de nodos',CONT_NODOS2,'FILAS NODOS2' CLOSE(unit=101,status='keep') ALLOCATE (NODOS2(CONT_NODOS2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_NODOS2 NODOS2(I,1:4)=NODOS2_MAX(I,1:4) ENDDO C C C LEE EL GRUPO DE ELEMENTOS DEL HUESO DEL ARCHIVO HUESO.txt Y LOS GUARDA EN LA VARIABLE "HUESO" Y SE COPIA HUESO EN HUESO2. OPEN (unit=101,file='C:\FORTRAN\HUESO.txt',status='unknown') CONT_HUESO=0 DO I=1,MAX READ(101,*,END=18) (HUESO_MAX(I,J),J=1,5) CONT_HUESO=CONT_HUESO+1 ENDDO

154

Anexo III Rutinas para obtener los modelos de elementos finitos

18 WRITE(*,*) 'Terminada lectura de nodos',CONT_HUESO,'FILAS HUESO' CLOSE(unit=101,status='keep') ALLOCATE (HUESO(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO(I,1:5)=HUESO_MAX(I,1:5) ENDDO ALLOCATE (HUESO2(CONT_HUESO,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_HUESO HUESO2(I,1:5)=HUESO_MAX(I,1:5) ENDDO C C LEE EL GRUPO DE ELEMENTOS DE LA PIEL DEL ARCHIVO PIEL.txt Y LOS GUARDA EN LA VARIABLE "PIEL" OPEN (unit=101,file='C:\FORTRAN\PIEL.txt',status='unknown') CONT_PIEL=0 DO I=1,MAX READ(101,*,END=19) (PIEL_MAX(I,J),J=1,5) CONT_PIEL=CONT_PIEL+1 ENDDO 19 WRITE(*,*) 'Terminada lectura de nodos',CONT_PIEL,'FILAS PIEL' CLOSE(unit=101,status='keep') ALLOCATE (PIEL(CONT_PIEL,5),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF DO I=1,CONT_PIEL PIEL(I,1:5)=PIEL_MAX(I,1:5) ENDDO C C ALMACENA EN UN VECTOR COLUMNA TODOS LOS NODOS COMUNES A NPIEL Y NHUESO AUX=0 DO I=1,CONT_NPIEL DO J=1,16 IF(NPIEL(I,J).NE.0.0)THEN DO K=1,CONT_NHUESO DO L=1,16 IF(NPIEL(I,J).EQ.NHUESO(K,L))THEN AUX=AUX+1 COMUNES(AUX,1)=NPIEL(I,J) EXIT ENDIF ENDDO ENDDO ENDIF ENDDO ENDDO

155

Anexo III Rutinas para obtener los modelos de elementos finitos

C SELECCIONA LOS NODOS DEL VECTOR COMUNES, DENTRO DEL GRUPO C "NAUX_VEST". PARA OBTENER LOS NODOS COMUNES ENTRE PIEL Y HUESO C DEL VESTIBULO: "NVEST". Y SE GUARDA MEMORIA PARA DEF_NVEST Y NDUPL. AUX2=0 DO I=1,AUX DO J=1,CONT_NAUX_VEST DO K=1,16 IF(COMUNES(I,1).EQ.NAUX_VEST(J,K))THEN AUX2=AUX2+1 NVEST(AUX2,1)=NAUX_VEST(J,K) EXIT ENDIF ENDDO ENDDO ENDDO ALLOCATE (DEF_NVEST(AUX2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF ALLOCATE (NDUPL(AUX2,4),STAT=EXITO) IF (EXITO.NE.0) THEN PRINT*,"ERROR" ENDIF C C C SELECCIONA LOS NODOS DEL VECTOR "NVEST", DE ENTRE LA DEFINICIN DE TODOS LOS NODOS EN "NODOS2". PARA OBTENER LA DEFINICIN DE LOS NODOS COMUNES ENTRE PIEL Y HUESO DEL VESTIBULO DO I=1,AUX2 DO J=1,CONT_NODOS2 IF(NVEST(I,1).EQ.INT(NODOS2(J,1)))THEN DO K=1,4 DEF_NVEST(I,K)=NODOS2(J,K) ENDDO EXIT ENDIF ENDDO ENDDO

C DEFINE EL NUMERO DE NODO A PARTIR DEL CUAL SE COMIENZA LA DUPLICACIN INICIODEFINICION=200000 C LOS C SE DUPLICAN LOS NODOS DE LA VARIABLE "DEF_NVEST", ALMACENANDOSE DUPLICADOS EN LA VARIABLE "NDUPL" AUX3=INICIODEFINICION+1 DO I=1,AUX2 NDUPL(I,1)=AUX3 AUX3=AUX3+1 ENDDO DO I=1,AUX2 DO K=2,4 NDUPL(I,K)=DEF_NVEST(I,K) ENDDO ENDDO

156

Anexo III Rutinas para obtener los modelos de elementos finitos

C C C C NODOS C C

LECTURA ELTO A ELTO DE "HUESO" SE BUSCAN DE ENTRE LOS NODOS QUE DEFINEN ESTOS ELEMENTOS IGUALES A LOS DE "NVEST" CDO SE ENCUENTRA SE VA ACTUALIZANDO LA VBLE "HUESO2" CON LOS DUPLICADOS "NDUPL" DO I=1,CONT_HUESO DO K=1,AUX2 IF(NVEST(K,1).EQ.HUESO(I,2))THEN HUESO2(I,2)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,3))THEN HUESO2(I,3)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,4))THEN HUESO2(I,4)=INT(NDUPL(K,1)) ENDIF IF(NVEST(K,1).EQ.HUESO(I,5))THEN HUESO2(I,5)=INT(NDUPL(K,1)) ENDIF ENDDO ENDDO

ESCRIBE EL .INP RESULTANTE DE CREAR EL VESTIBULO OPEN (unit=101,file='2D_CREA_VESTIBULO.inp',status='unknown') WRITE(101,*) '*NODE,NSET=NODOS' DO I=1,CONT_NODOS2 WRITE(101,27) INT(NODOS2(I,1)),',',NODOS2(I,2),',',NODOS2(I,3), 1 ',',NODOS2(I,4) ENDDO DO I=1,AUX2 WRITE(101,27) INT(NDUPL(I,1)),',',NDUPL(I,2),',',NDUPL(I,3), 1 ',',NDUPL(I,4) ENDDO WRITE(101,*) '*ELEMENT,TYPE=CPE4H,ELSET=PIEL' DO I=1,CONT_PIEL WRITE(101,28) PIEL(I,1),',',PIEL(I,2),',',PIEL(I,3), 1 ',',PIEL(I,4),',',PIEL(I,5) ENDDO WRITE(101,*) '*ELEMENT,TYPE=S4,ELSET=HUESO' DO I=1,CONT_HUESO WRITE(101,28) HUESO2(I,1),',',HUESO2(I,2),',',HUESO2(I,3), 1 ',',HUESO2(I,4),',',HUESO2(I,5) ENDDO CLOSE(unit=101,status='keep') 27 FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8) 28 FORMAT(I8,A1,I8,A1,I8,A1,I8,A1,I8) END

157

You might also like