Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anexo III
98
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 1 %
C % "selnodosyeltos.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Imaginese que se tiene la definición de nodos y elementos de un
C modelo. También se tiene un grupo de elementos y sus nodos (pero
C no la definición de los mismos) correspondientes a un submodelo
C del modelo inicial. Este programa permite obtener la definición
C de los nodos y elementos del submodelo, a partir de la
C definición de los nodos y elementos del modelo inicial.
C
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](:,:)
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
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
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
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
100
Anexo III – Rutinas para obtener los modelos de elementos finitos
101
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 2 %
C % "n_comun_2grupos.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa proporciona la definición de los nodos comunes a
C dos grupos de nodos. Para ello también es necesaria una variable
C que contenga la definición de los nodos. En nuestro caso la
C definición de los nodos de la región de la boca.
C
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)
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
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
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
103
Anexo III – Rutinas para obtener los modelos de elementos finitos
CLOSE(unit=101,status='keep')
12 FORMAT(I8)
C ESCRIBE LA DEFINICIÓN 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')
11 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ódigo 3 %
C % "proyecta.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa lee una superficie de nodos, los cuales son
C proyectados sobre un plano que se define a partir de tres nodos
C que pertenezcan al grupo de nodos de la superficie. Luego nos
C calcula los desplazamientos necesarios a dar a cada nodo de la
C superfice para que sea proyectado sobre el plano definido.
C
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](:,:)
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
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
106
Anexo III – Rutinas para obtener los modelos de elementos finitos
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')
12 FORMAT(I8,A1,I8,A1,I8,A1,F12.8)
END
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 4 %
107
Anexo III – Rutinas para obtener los modelos de elementos finitos
C % "restringe.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa lee un grupo de nodos y los escribe con el
C formato de condición de contorno de ABAQUS, con desplazamientos
C nulos.
C
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)
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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
108
Anexo III – Rutinas para obtener los modelos de elementos finitos
C % Código 5 %
C % "geomdef.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C
C
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](:,:)
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
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
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')
11 FORMAT(I8,A1,E16.8,A1,E16.8,A1,E16.8)
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
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
Anexo III – Rutinas para obtener los modelos de elementos finitos
C % Código 6 %
C % "separación_comisura.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa obtiene primero la superficie de nodos comunes a
C dos grupos de nodos y su definición. Posteriormente los duplica,
C comenzando la duplicación en el índice que deseemos. Y asigna,
C los nodos duplicados a formar parte de un grupo de elementos
C que indicamos.
C
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)
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
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
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
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
113
Anexo III – Rutinas para obtener los modelos de elementos finitos
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
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
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
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
115
Anexo III – Rutinas para obtener los modelos de elementos finitos
OPEN (unit=101,file='NCOMUN.txt',status='unknown')
DO I=1,AUX
WRITE(101,21) NCOMUN(I,1)
ENDDO
CLOSE(unit=101,status='keep')
21 FORMAT(I8)
116
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 7 %
C % "crear_shell.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
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](:,:)
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
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
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
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
ALLOCATE (SH_LI(CONT_ESLI,4),STAT=EXITO)
IF (EXITO.NE.0) THEN
PRINT*,"ERROR"
ENDIF
119
Anexo III – Rutinas para obtener los modelos de elementos finitos
120
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 8 %
C % "actmod_completo.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
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](:,:)
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
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
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
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
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
END
123
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 9 %
C % "comunes_y_duplica.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa selecciona los nodos comunes a los grupos: "NPIEL"
C y "NHUESO". Luego busca los nodos comunes que pertenezcan al
C grupo de nodos "NAUX_VEST", guardándose en "NVEST". Se definen
C los nodos de "NVEST" con ayuda de la variable "NODOS2" que tiene
C la definición de todos los nodos del modelo. Se duplica "NVEST"
C en la variable "NDUPL". Finalmente se sustituyen los nodos
C duplicados por los correspondientes nodos de la definición de
C elementos del grupo Hueso.
C
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](:,:)
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
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
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
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
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
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
127
Anexo III – Rutinas para obtener los modelos de elementos finitos
ENDIF
ENDDO
ENDDO
END
128
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 10 %
C % "separar_mandibula.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa permite separar el grupo seleccionado como
C mandíbula del resto de estructura ósea. Se parte de los archivos
C NPyH, HUESO, PIEL, NODOS_MAND, NODOS_MSYC, MAXSUP_Y_CRANEO y
C MANDIBULA. Se comienza con la creación de la definición de los
C elementos de la mandíbula y del maxilar superior y craneo.
C Luego se buscan los nodos comunes a estos dos grupos y se
C duplican. Por último se asignan los nodos duplicados a la
C definición del maxilar superior y cráneo, y se actualiza la
C 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](:,:)
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
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 (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
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
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
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
131
Anexo III – Rutinas para obtener los modelos de elementos finitos
C 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 definición'
C
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
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
WRITE(*,*) 'Terminada definición e inicio duplicación'
C
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
133
Anexo III – Rutinas para obtener los modelos de elementos finitos
C
WRITE(*,*) 'Terminada duplicación e inicio asignación
duplicados'
C
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
END
135
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 11 %
C % "Movimiento_mandibula.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C
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](:,:)
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
136
Anexo III – Rutinas para obtener los modelos de elementos finitos
C 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
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 definición nodos
1mandíbula'
C
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 definición nodos mandíbula e inicio def
1movimiento'
C
138
Anexo III – Rutinas para obtener los modelos de elementos finitos
C VECTOR TRASLACIÓN
V(1,1)=0
V(1,2)=0
V(1,3)=0
C DOS PUNTOS QUE DEFINEN EL EJE DE ROTACIÓN
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
C ÁNGULO EN DECIMALES
BETA=15
TS=360
PI=3.14159265
C
BETAR=BETA*2*PI/TS
C
WRITE(*,*) 'Terminada definición 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)
C
DO I=1,AUX
C TERMINO INDEPENDIENTE DE UN PLANO PERPENDICULAR AL VECTOR "AB"
C 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)
C RECTA AB EN IMPLÍCITAS, SE INTRODUCE EN LA ECUACIÓN DEL PLANO
PARA
C DESPEJAR EL PARÁMETRO "T"
C X=A(1,1)+AB(1,1)*T
C Y=A(1,2)+AB(1,2)*T
C Z=A(1,3)+AB(1,3)*T
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 INTERSECCIÓN DE
AMBOS.
C SE LLAMA AL PUNTO INTERSECCIÓN "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)
139
Anexo III – Rutinas para obtener los modelos de elementos finitos
SP(I,3)=DNM(I,4)-S(I,3)
C 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)
ENDDO
C
WRITE(*,*) 'Comprobación'
C
C LA COMPROBACIÓN DEVUELVE LA DEFINICIÓN DE NODOS: NPyH CON
C EL MOVIMIENTO IMPUESTO A LA MANDÍBULA. DE MANERA QUE AL CARGARLO
C EN ABAQUS CAE SE COMPRUEBE QUE EL GIRO SE REALIZA CON EXITO.
C LA NUEVA DEFINICIÓN DE "NPyH" SE OBTENDRÁ EN "NCOMP"
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
END
141
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 12 %
C % "Obtener_modelo_plano.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este código permite seleccionar una de las caras de los
C elementos hexaédricos que forman el modelo 2D recién exportado.
C Formando, por tanto, un modelo 2D real con elementos planos de
C 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
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
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
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 ALMACENA MEMORIA PARA UNA VARIABLE DEL MISMO TAMAÑO QUE NODOSP,
C A LA QUE LLAMAREMOS NODOSDEF_MAX, AUNQUE LA CAPACIDAD DE ESTA NO
SERÁ
C COMPLETADA
ALLOCATE (NODOSDEF_MAX(CONT_NODOSP,4),STAT=EXITO)
IF (EXITO.NE.0) THEN
PRINT*,"ERROR"
ENDIF
143
Anexo III – Rutinas para obtener los modelos de elementos finitos
C 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
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
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
END
146
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 12 %
C % "Separar_comisura2D.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Esta rutina crea la comisura del modelo bidimensional de eltos
C 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)
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
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
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
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
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
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
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
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
150
Anexo III – Rutinas para obtener los modelos de elementos finitos
ENDDO
ENDDO
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
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)
END
152
Anexo III – Rutinas para obtener los modelos de elementos finitos
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C % Código 13 %
C % "Comunes_y_duplica2D.for" %
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C
C Este programa crea el vestíbulo del modelo 2D de elementos
C planos, una vez se ha realizado sobre este la separación de los
C 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](:,:)
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
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
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
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
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
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
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
155
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
156
Anexo III – Rutinas para obtener los modelos de elementos finitos
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
END
157