Download presentation
Presentation is loading. Please wait.
Published bySharyl Thornton Modified over 9 years ago
1
Documentation of the Library FPP 高エネルギー加速器研究機構 KEK Etienne Forest and Yukiko Nogiwa With the help of Frank Schmidt and Piotr Skowronski FPP creates a type Taylor to overload the LBL version of Berz’s “DA” package and the associated Lielib of Forest. Out of this Taylor type, we creates a polymorphic taylor type that can switch between double and Taylor at execution time. mad.web.cern.ch/mad/PTC_proper PROGRAM EXAMPLE USE POLYMORPHIC_COMPLEXTAYLOR IMPLICIT NONE INTEGER NO,NV TYPE(TAYLOR) F,DF NO=4; NV= 2; ! NO: THE ORDER OF THE POLYNOMIAL !NV: THE NUMBER OF VARIABLES CALL INIT(NO,NV) ! INITIALIZES TAYLOR SERIES WITHOUT MAPS CALL ALLOC(F,DF) ! MUST BE CONSTRUCTED AFTER INIT F=(2.D0.MONO.'12') + (3.D0.MONO.'11') + 4.D0 ! CREATES 2.D0 X_1 X_ 2 ^2+3.D0 X_1X_2 +4.D0 DF=F.D.2 ! DF/DX_2 CREATES 4.D0 X_1X_2 + 3.D0 X_1 CALL PRINT(F,6) CALL PRINT(DF,6) CALL KILL(F,DF) ! MUST BE DESTROYED END PROGRAM EXAMPLE PROGRAM EXAMPLE USE POLYMORPHIC_COMPLEXTAYLOR IMPLICIT NONE INTEGER NO,NV TYPE(TAYLOR) F,DF NO=4; NV= 2; ! NO: THE ORDER OF THE POLYNOMIAL NV: THE NUMBER OF VARIABLES CALL INIT(NO,NV) ! INITIALIZES TAYLPROGRAM EXAMPLE USE POLYMORPHIC_COMPLEXTAYLOR IMPLICIT NONE INTEGER NO,NV REAL(DP) R TYPE(TAYLOR) F,G INTEGER, ALLOCATABLE :: J(:),K(:) NO=4; NV= 2; ! NO: THE ORDER OF THE POLYNOMIAL NV: THE NUMBER OF VARIABLES CALL INIT(NO,NV) ! INITIALIZES TAYLOR SERIES WITHOUT MAPS CALL ALLOC(F,G) ! MUST BE CONSTRUCTED AFTER INIT ALLOCATE(J(NV)) ALLOCATE(K(NV)) J=0 J(1)=1;J(2)=2; K=0 K(1)=3;K(2)=1; F=(2.D0.MONO.J) + 5.D0 ! CREATES 2.D0 X_1 X_ 2 ^2 + 5.D0 R=F.SUB.J ! PEEKS COEFFICIENT 2.D0 CALL PRINT( F,6) WRITE(6,*) R F=(2.D0.MONO.J) + (4.D0.MONO.K) + 5.D0 ! CREATES 2.D0 X_1 X_ 2 ^2 + 4.D0 X_1 ^3 X_ 2 + 5.D0 R=F.SUB.K ! PEEKS COEFFICIENT 4.D0 CALL PRINT( F,6) WRITE(6,*) R F=(2.D0.MONO.'12' ) + (4.D0.MONO.'13' ) + ( 3.D0.MONO.'01') + 5.D0 ! CREATES 2.D0 X_1 X_ 2 ^2 + 4.D0 X_1 X_ 2 ^3 + 3.D0 X_ 2 + 5.D0 R=F.SUB.'13' ! PEEKS COEFFICIENT 4.D0 CALL PRINT( F,6) WRITE(6,*) R DEALLOCATE(J) CALL KILL(F,G) ! MUST BE DESTROYED END PROGRAM EXAMPLER SERIES WITHOUT MAPS WRITE(MF,*) " " WRITE(MF,*) " ORIGINAL VECTOR FIELD - COMPUTED ONE LIE EXPONENT " CALL PRINT(RESIDUAL,MF,PREC) DF=MAP WRITE(MF,*) " " WRITE(MF,*) " DRAGT-FINN REPRESENTATION " WRITE(MF,*) " " CALL PRINT(DF,MF,PREC) RESIDUAL=DF RESIDUAL=MAP-RESIDUAL WRITE(MF,*) " " WRITE(MF,*) " ORIGINAL MAP - COMPUTED DRAGT-FINN " WRITE(MF,*) " " CALL PRINT(RESIDUAL,MF,PREC) RDF=MAP WRITE(MF,*) " " WRITE(MF,*) " REVERSE DRAGT-FINN REPRESENTATION " WRITE(MF,*) " " CALL PRINT(RDF,MF,PREC) RESIDUAL=RDF RESIDUAL=MAP-RESIDUAL WRITE(MF,*) " " WRITE(MF,*) " ORIGINAL MAP - COMPUTED REVERSE DRAGT-FINN " WRITE(MF,*) " " CALL PRINT(RESIDUAL,MF,PREC) CALL KILL(ID, MAP, RESIDUAL) CALL KILL(F); CALL KILL(SINGLE);CALL KILL(DF);CALL KILL(RDF); CLOSE(MF); END PROGRAM MAPS SUBROUTINE VECFIELD_QUAD(L,K,F) USE POLYMORPHIC_COMPLEXTAYLOR IMPLICIT NONE TYPE(VECFIELD) F REAL(DP) L,K ! DRIFT PART F%V(1)=L*(1.D0.MONO.'01') /SQRT(1.D0-(1.D0.MONO.'02')-(1.D0.MONO.'0002')) F%V(3)=L*(1.D0.MONO.'0001')/SQRT(1.D0-(1.D0.MONO.'02')-(1.D0.MONO.'0002')) ! QUADRUPOLE PART F%V(2)=-L*K*(1.D0.MONO.'1') F%V(4)= L*K*(1.D0.MONO.'001') END SUBROUTINE VECFIELD_QUAD SUBROUTINE PBFIELD_QUAD(L,K,H) USE POLYMORPHIC_COMPLEXTAYLOR IMPLICIT NONE TYPE(PBFIELD) H REAL(DP) L,K ! DRIFT PART H=L*SQRT(1.D0-(1.D0.MONO.'02')-(1.D0.MONO.'0002')) ! QUADRUPOLE PART H%H=H%H-(L*K/2.D0)*((1.D0.MONO.'2')-(1.D0.MONO.'002')) END SUBROUTINE PBFIELD_QUAD PROGRAM MAPS USE POLYMORPHIC_COMPLEXTAYLOR TYPE(DAMAP) ID, MAP, RESIDUAL REAL(DP) L1,KICK1,L2,KICK2,LD REAL(DP) :: PREC = 1.D-10 TYPE(VECFIELD) F TYPE(ONELIEEXPONENT) SINGLE TYPE(DRAGTFINN) DF TYPE(REVERSEDRAGTFINN) RDF INTEGER I INTEGER MF,ME MF=20 OPEN(UNIT=MF,FILE='RESULTS.TXT') CALL INIT(NO1=4,ND1=2,NP1=0,NDPT1 =0) ! -INIT FOR MAPS IN ND1 DEGREES OF FREEDOM CALL ALLOC(ID, MAP, RESIDUAL) ;CALL ALLOC(F); CALL ALLOC(SINGLE);CALL ALLOC(DF);CALL ALLOC(RDF); KICK2=-0.9D0; L2=0.1D0 CALL VECFIELD_QUAD(L2,KICK2,F) F%V(1)=0.01D0+F%V(1) F%V(2)=0.02D0+F%V(2) ID=1 MAP=TEXP(F,ID) CALL PRINT(MAP,MF) SINGLE=MAP DO I=1,C_%ND2 RESIDUAL%V(I)=SINGLE%VECTOR%V(I)-F%V(I) ENDDO Illustrating vector fields by creating a quadrupole Taylor map using “COSY-INFINITY-style” methods PROGRAM TWISS_PTC USE MADX_KEYWORDS IMPLICIT NONE REAL(DP) X_ORBIT(6) INTEGER I,NO TYPE(FIBRE), POINTER :: P TYPE(LAYOUT), POINTER :: MY_RING REAL(DP) BETA_X,BETA_Z TYPE(REAL_8) X_POL(6) TYPE(DAMAP) ID TYPE(NORMALFORM) NFORM TYPE(MAD_UNIVERSE) M_U CALL SET_UP_UNIVERSE(M_U) CALL APPEND_EMPTY_LAYOUT(M_U) CALL READ_INTO_VIRGIN_LAYOUT(M_U%START,"ALS.TXT") MY_RING=>M_U%START P=>MY_RING%START CALL ALLOC(X_POL); X_ORBIT=0.D0; CALL FIND_ORBIT(MY_RING,X_ORBIT,1,DEFAULT,1.D-6) WRITE(6,*) X_ORBIT WRITE(6,*) "GIVE ORDER OF TAYLOR MAP ";READ(5,*) NO; IF(NO>0) THEN CALL INIT(DEFAULT,NO,0,BERZ) CALL ALLOC(ID);CALL ALLOC(NFORM); ID=1 X_POL=X_ORBIT+ID ELSE X_POL=X_ORBIT ENDIF CALL TRACK(MY_RING,X_POL,1,DEFAULT) WRITE(6,*) "POLYMORPHS PRINTED " CALL PRINT(X_POL,6) IF(NO>0) THEN ! WE WILL DO A TWISS CALCULATION OF BETA_X NFORM=X_POL WRITE(6,*) NFORM%TUNE X_POL=X_ORBIT+NFORM%A_T BETA_X= (X_POL(1).SUB.'100000')**2+(X_POL(1).SUB.'010000')**2 BETA_Z= (X_POL(6).SUB.'000010')**2+(X_POL(6).SUB.'000001')**2 WRITE(6,*) 'POS = ',0,' BETA_X = ', BETA_X WRITE(6,*) ' BETA_Z = ', BETA_Z DO I=1,MY_RING%N CALL TRACK(MY_RING,X_POL,I,I+1,DEFAULT) BETA_X= (X_POL(1).SUB.'100000')**2+(X_POL(1).SUB.'010000')**2 BETA_Z= (X_POL(6).SUB.'000010')**2+(X_POL(6).SUB.'000001')**2 IF(MOD(I,50)==1.OR.I==MY_RING%N) THEN WRITE(6,*) 'POS = ',I,' BETA_X = ', BETA_X WRITE(6,*) ' BETA_Z = ', BETA_Z ENDIF ENDDO ENDIF CALL KILL(X_POL); IF(NO>1) THEN CALL KILL(ID); ENDIF END PROGRAM TWISS_PTC Simple calculation of x and z in a tracking code, here PTC using FPP. Theory Computer Implementation
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.