C DIÓGENES MORALES SIERRA 02-08-05 C C---------------------------------------------CONTACTO_DEBIL_POT--- C C SUBRUTINA CONTACTO_DEBIL_POT C C MONTAJE DE LAS ECUACIONES LINEALES DE CONTACTO EN FORMA DEBIL; C LAS DE EQUILIBRIO, LAS DE COMPATIBILIDAD Y LAS DE CONTACTO C TÉRMICO PERFECTO E IMPERFECTO C SUBROUTINE CONTACTO_DEBIL_POT(PRB,CNT,ELTP,ELT, @ NOD,ZCTO,SAij,SFi,SOL) C IMPLICIT NONE INCLUDE '_param.for' INCLUDE '_struct.for' C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C VARIABLES EXTERNAS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C PRB : Variables del problema RECORD /S_problema/ PRB RECORD /S_solido/ SOL(N_MAX_SOL) C CNT : Contornos del problema RECORD /S_contorno/ CNT(N_MAX_CNT) C ELTP : Tipos de elemento RECORD /S_tipelt/ ELTP(N_MAX_TPEL) C ELT : Elementos del problema RECORD /S_elemento/ ELT(N_MAX_ELT) C NOD : Nodos del problema RECORD /S_nodo/ NOD(N_MAX_NOD) C ZCTO : Zona de contacto RECORD /S_zncto/ ZCTO C SAIJ(,) : Matriz del sistema. REAL*8 SAij(N_MAX_INC,N_MAX_INC) C SFi() : Termino independiente. REAL*8 SFi(N_MAX_INC) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C VARIABLES INTERNAS CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C I,J : Contadores INTEGER I,J,S1,S2,K,M C CNTA,CNTB : Contornos A y B de la zona de contacto INTEGER CNTA,CNTB C Contadores INTEGER ANOD,CELTA,CELTB,PNODA,PELTA,UELTA,UNODA, @ PNODB,PELTB,UELTB,UNODB,PA,UA,PB,UB C CELTA Y UELTA LOS USO PARA EL PRIMER Y ULTIMO NODO C n1A,n2A,n1B,n2B : Nodos extremos de los elementos A y B INTEGER n1A,n2A,n3A,n1B,n2B,n3B C CEQ : Contador de ecuaciones de contacto INTEGER CEQ C NZDCTO: Matriz que almacena los nodos de las zonas cto REAL*8 NZDCTO(N_ZMAX_ZCTO,2) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C RUTINA ECUACIONES CONTACTO DEBIL CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C MONTO BUCLE PARA IDENTIFICAR ZONAS C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ZONA A DEL CONTORNO DE CONTACTO CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C CALCULO EL NUMERO DE CEQ YA ESTABLECIDAS ceq=PRB.NAP+PRB.NBIE+PRB.NCE+1 C ACTUALIZO EL CONTADOR DE ZONAS DE CONTORNO DO J=1,N_ZMAX_ZCTO NZDCTO(J,1)=0 NZDCTO(J,2)=0 END DO C ESTABLEZCO LAS DIFERENTES ZONAS EN LA ZPOTENCIAL DE CONTACTO cntA=ZCTO.CNT(1) cntB=ZCTO.CNT(2) S1=CNT(cntA).SOL CELTA=ELT(CNT(cntA).ELT(1)).NI(1) UELTA=ELT(CNT(cntA).ELT(CNT(cntA).NELT)).NI(2) C DISTINGUIMOS ENTRE SI EL PRIMER NODO SE ENCUENTRA O NO C EN LA ZONA DE CONTACTO NZDCTO(1,1)=CELTA J=1 IF(CELTA.GT.UELTA)THEN DO K=CELTA,SOL(S1).NNOD SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO DO K=1,UELTA SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO NZDCTO(J,2)=K-1 ELSE DO K=CELTA,UELTA SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO NZDCTO(J,2)=K-1 END IF PA=0 DO K=1,J IF (NZDCTO(K,1).GT.0)THEN C Para zonas no definidas no hacemos nada (evitar que introduzce error c al ir a una zona entre 0 y 0) IF(MOD(K,2).EQ.0)THEN C LOS PARES SON CONTACTOS Y LOS IMPARES ZONAS LIBRES IF(NZDCTO(K,1).GT.NZDCTO(K,2))THEN C SE DIFERENCIA ENTRE ZONAS DE CONTACTO DONDE EL NODO DE COMIENZO C SE ENCUENTRE EN ELLA Y LAS ZONAS DONDE LA NUMERACIÓN CREZCA CONTINUAMENTE C 1----------------------------------------------------------------------- DO M=NZDCTO(K,1),SOL(S1).NOD(SOL(S1).NNOD) PA=PA+1 IF(M.EQ.NZDCTO(K,1))THEN C EL PRIMER NODO SOLO HAY COMPATIBILIDAD EN EL ELMTO POSTERIOR C ELEMENTO POSTERIOR AL NODO n1A=CNT(cntA).ELT(PA) CALL COMPAT_ELTO_DEB_POT(M,n1A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C LOS NODOS INTERMEDIOS HAY QUE ESTABLECER LA COMPATIBILIDAD C POR DELANTE Y POR DETRAS,SIN INCREMENTAR EL Nº DE ECS C ELEMENTO POSTERIOR AL NODO n1A=CNT(cntA).ELT(PA) CALL COMPAT_ELTO_DEB_POT(M,n1A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C ELEMENTO ANTERIOR AL NODO n2A=CNT(cntA).ELT(PA-1) CALL COMPAT_ELTO_DEB_POT(M,n2A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C AHORA INCREMENTO CONTADOR DE ECUACIONES ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO C 2------------------------------------------------------------------------- DO M=SOL(S1).NOD(1),NZDCTO(K,2) PA=PA+1 IF(M.EQ.NZDCTO(K,2))THEN C EL ULTIMO NODO SOLO HAY COMPATIBILIDAD EN EL ELMTO ANTERIOR C ELEMENTO ANTERIOR AL NODO n2A=CNT(cntA).ELT(PA-1) CALL COMPAT_ELTO_DEB_POT(M,n2A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C LOS NODOS INTERMEDIOS HAY QUE ESTABLECER LA COMPATIBILIDAD C POR DELANTE Y POR DETRAS,SIN INCREMENTAR EL Nº DE ECS C ELEMENTO POSTERIOR AL NODO n1A=CNT(cntA).ELT(PA) CALL COMPAT_ELTO_DEB_POT(M,n1A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C ELEMENTO ANTERIOR AL NODO n2A=CNT(cntA).ELT(PA-1) CALL COMPAT_ELTO_DEB_POT(M,n2A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C AHORA INCREMENTO CONTADOR DE ECUACIONES ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO ELSE C CASO ZONA DE NUMERACIÓN CONTINUA C 3--------------------------------------------------------------------------- DO M=NZDCTO(K,1),NZDCTO(K,2) PA=PA+1 IF(M.EQ.NZDCTO(K,1))THEN C EL PRIMER NODO SOLO HAY COMPATIBILIDAD EN EL ELMTO POSTERIOR C ELEMENTO POSTERIOR AL NODO n1A=CNT(cntA).ELT(PA) CALL COMPAT_ELTO_DEB_POT(M,n1A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE IF(M.EQ.NZDCTO(K,2))THEN C EL ULTIMO NODO SOLO HAY COMPATIBILIDAD EN EL ELMTO ANTERIOR C ELEMENTO ANTERIOR AL NODO n2A=CNT(cntA).ELT(PA-1) CALL COMPAT_ELTO_DEB_POT(M,n2A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C LOS NODOS INTERMEDIOS HAY QUE ESTABLECER LA COMPATIBILIDAD C POR DELANTE Y POR DETRAS,SIN INCREMENTAR EL Nº DE ECS C ELEMENTO POSTERIOR AL NODO n1A=CNT(cntA).ELT(PA) CALL COMPAT_ELTO_DEB_POT(M,n1A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C ELEMENTO ANTERIOR AL NODO n2A=CNT(cntA).ELT(PA-1) CALL COMPAT_ELTO_DEB_POT(M,n2A,CNT(cntB) @ ,ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA,ZCTO.NDA_ELB, @ ZCTO.POSB,SAij,SFi,ceq) C AHORA INCREMENTO CONTADOR DE ECUACIONES ceq=ceq+1 IF(ceq.GT.N_MAX_INC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF C ********************************************** C EC DE CONTACTO PERFECTO/IMPERFECTO C (El contorno A es el que gobierna C las EC LINEALES DE CONTACTO PERFECTO IMPERFECTO) C ********************************************** CALL CONT_PER_IMPER_POT(NOD(M),SAij,SFi,ceq @ ,UELTA,CELTA) C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO END IF ELSE C PARA LOS NODOS LIBRES DEL CONTORNO A IF(NZDCTO(K,1).GT.NZDCTO(K,2))THEN C SE DIFERENCIA ENTRE ZONAS DE CONTACTO DONDE EL NODO DE COMIENZO C SE ENCUENTRE EN ELLA Y LAS ZONAS DONDE LA NUMERACIÓN CREZCA CONTINUAMENTE C 4----------------------------------------------------------------------- DO M=NZDCTO(K,1),SOL(S1).NOD(SOL(S1).NNOD) C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,1) END DO DO M=SOL(S1).NOD(1),NZDCTO(K,2) C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,1) END DO PA=PA+SOL(S1).NOD(SOL(S1).NNOD)-NZDCTO(K,1)+ @ NZDCTO(K,2)-SOL(S1).NOD(1) ELSE C ZONA NUMERADA DE FORMA CONTINUA C 5----------------------------------------------------------------------- DO M=NZDCTO(K,1),NZDCTO(K,2) C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,1) END DO PA=PA+NZDCTO(K,2)-NZDCTO(K,1) END IF END IF END IF END DO CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ZONA B DEL CONTORNO DE CONTACTO CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC DO J=1,N_ZMAX_ZCTO NZDCTO(J,1)=0 NZDCTO(J,2)=0 END DO cntB=ZCTO.CNT(2) S2=CNT(cntB).SOL CELTB=ELT(CNT(cntB).ELT(1)).NI(1) UELTB=ELT(CNT(cntB).ELT(CNT(cntB).NELT)).NI(2) NZDCTO(1,1)=CELTB J=1 IF(CELTB.GT.UELTB)THEN DO K=CELTB,SOL(S2).NOD(SOL(S2).NNOD) SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO DO K=SOL(S2).NOD(1),UELTB SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO NZDCTO(J,2)=K-1 ELSE DO K=CELTB,UELTB SELECT CASE (NOD(K).CBC(1)) CASE (47,57,46,56,48,58) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE (44,55,66,77,88,67,76,68,86,78,87) CONTINUE CASE (74,75,64,65,84,85) NZDCTO(J,2)=K J=J+1 NZDCTO(J,1)=K CASE DEFAULT WRITE(F_W,10104) N2A WRITE( *,10104) N2A STOP END SELECT END DO NZDCTO(J,2)=K-1 END IF C INTRODUCE LAS ECS DE EQUILIBRIO DE LA ZONA B PA=0 K=1 DO WHILE(K.LE.J) IF (NZDCTO(K,1).GT.0)THEN C Para zonas no definidas no hacemos nada (evitar que introduzce error C al ir a una zona entre 0 y 0) IF(MOD(K,2).EQ.0)THEN C LOS PARES SON CONTACTOS Y LOS IMPARES ZONAS LIBRES IF(NZDCTO(K,1).GT.NZDCTO(K,2))THEN C SE DIFERENCIA ENTRE ZONAS DE CONTACTO DONDE EL NODO DE COMIENZO C SE ENCUENTRE EN ELLA Y LAS ZONAS DONDE LA NUMERACIÓN CREZCA CONTINUAMENTE C 6----------------------------------------------------------------------- DO M=NZDCTO(K,1),SOL(S2).NOD(SOL(S2).NNOD) PA=PA+1 IF(M.EQ.NZDCTO(K,1))THEN C EL PRIMER NODO SOLO HAY EQUILIBRIO EN EL ELMTO POSTERIOR C ELEMENTO POSTERIOR AL NODO n1B=CNT(cntB).ELT(PA) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n1B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C ELEMENTO POSTERIOR AL NODO n1B=CNT(cntB).ELT(PA) C ELEMENTO ANTERIOR AL NODO n2B=CNT(cntB).ELT(PA-1) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n1B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) CALL EQUIL_ELTO_DEB_POT(M,n2B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO DO M=SOL(S2).NOD(1),NZDCTO(K,2) PA=PA+1 IF(M.EQ.NZDCTO(K,2))THEN C EL PRIMER NODO SOLO HAY EQUILIBRIO EN EL ELMTO ANTERIOR C ELEMENTO ANTERIOR AL NODO n2B=CNT(cntB).ELT(PA-1) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n2B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C ELEMENTO POSTERIOR AL NODO n1B=CNT(cntB).ELT(PA) C ELEMENTO ANTERIOR AL NODO n2B=CNT(cntB).ELT(PA-1) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n1B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) CALL EQUIL_ELTO_DEB_POT(M,n2B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO ELSE C ZONA NUMERADA DE FORMA CONTINUA C 7----------------------------------------------------------------------- DO M=NZDCTO(K,1),NZDCTO(K,2) PA=PA+1 IF(M.EQ.NZDCTO(K,1))THEN C EL PRIMER NODO SOLO HAY EQUILIBRIO EN EL ELMTO POSTERIOR C ELEMENTO POSTERIOR AL NODO n1B=CNT(cntB).ELT(PA) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n1B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE IF(M.EQ.NZDCTO(K,2))THEN C EL PRIMER NODO SOLO HAY EQUILIBRIO EN EL ELMTO ANTERIOR C ELEMENTO ANTERIOR AL NODO n2B=CNT(cntB).ELT(PA-1) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n2B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF ELSE C ELEMENTO POSTERIOR AL NODO n1B=CNT(cntB).ELT(PA) C ELEMENTO ANTERIOR AL NODO n2B=CNT(cntB).ELT(PA-1) IF(ZCTO.NDB_ELA(M).NE.0)THEN C Nodo dentro de la zona contacto C CALL EQUIL_ELTO_DEB_POT(M,n1B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) CALL EQUIL_ELTO_DEB_POT(M,n2B @ ,CNT(cntA),ELT,NOD,ZCTO.NDB_ELA,ZCTO.POSA @ ,ZCTO.NDA_ELB,ZCTO.POSB,SAij,SFi,ceq) ELSE WRITE(F_W,10104) N1B WRITE( *,10104) N1B STOP END IF C Incrementa el contador de ecuaciones ceq=ceq+1 IF(ceq.GT.N_MAX_EC)THEN WRITE(F_W,10103) N_MAX_EC WRITE( *,10103) N_MAX_EC STOP END IF END IF END DO END IF ELSE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C ZONAS LIBRES IF(NZDCTO(K,1).GT.NZDCTO(K,2))THEN C SE DIFERENCIA ENTRE ZONAS DE CONTACTO DONDE EL NODO DE COMIENZO C SE ENCUENTRE EN ELLA Y LAS ZONAS DONDE LA NUMERACIÓN CREZCA CONTINUAMENTE C 8----------------------------------------------------------------------- DO M=NZDCTO(K,1),SOL(S2).NOD(SOL(S2).NNOD) PA=PA+1 C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,2) END DO DO M=SOL(S2).NOD(1),NZDCTO(K,2) C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,2) END DO PA=PA+SOL(S2).NOD(SOL(S2).NNOD)-NZDCTO(K,1)+ @ NZDCTO(K,2)-SOL(S2).NOD(1) ELSE C ZONA NUMERADA DE FORMA CONTINUA C 9----------------------------------------------------------------------- DO M=NZDCTO(K,1),NZDCTO(K,2) C LLAMA A LA RUTINA PARA APLICAR NODOS LIBRES CALL NODO_LIBRE_POT(NOD(M),SAIJ,SFI,ceq,2) END DO PA=PA+NZDCTO(K,2)-NZDCTO(K,1) END IF END IF END IF K=K+1 END DO CCCCCCCCCCCCCCCCCCCCCCCC C FIN RUTINA CCCCCCCCCCCCCCCCCCCCCCCC C C PRB.NCE=ceq-1-PRB.NBIE-PRB.NAP C FIN DE LA RUTINA C RETURN C C FORMATOS DE ESCRITURA. C 10101 FORMAT(/,2x,'ERROR 10101 - CONTACTO_DEBIL_POT',/, @ ' Tipo de elemento (',i2,') no implementado.') 10103 FORMAT(/,2x,'ERROR 10103 - CONTACTO_DEBIL_POT',/, @ ' Numero de ecuaciones mayor de lo permitido (',i4,').') 10104 FORMAT(/,2x,'ERROR 10104 - CONTACTO_DEBIL_POT',/, @ ' Nodo numero ',i3,' fuera de la zona de contacto.') 10105 FORMAT(/,2x,'ERROR 10105 - CONTACTO_DEBIL_POT',/, @ ' Error en el programa. Revise la geometria de contacto.') 10106 FORMAT(/,2x,'ERROR 10105 - CONTACTO_DEBIL_POT',/, @ ' Error en el programa') C END C