MODULE Simple_Graphics USE Precision USE DISLIN IMPLICIT NONE PUBLIC::InitGraphics,EndGraphics,Plot2D,Plot2D_r_sp,Plot2D_r_dp PRIVATE INTEGER,PARAMETER,PUBLIC::r_sg=KIND(0.0) LOGICAL,SAVE::new_plot=.TRUE. INTEGER,SAVE::n_legend_lines=0,max_legend_lines=10,leg_pos=8,n_ticks=5 CHARACTER(LEN=2000),SAVE::Leg="" INTERFACE Plot2D MODULE PROCEDURE Plot2D_r_sp MODULE PROCEDURE Plot2D_r_dp END INTERFACE CONTAINS SUBROUTINE InitGraphics(file,file_type,n_plots,tex_mode,plot_title,x_label,y_label,z_label,tick_labels,legend_position,my_fu& &nc) CHARACTER(LEN=*),OPTIONAL,INTENT(IN)::file,file_type INTEGER,OPTIONAL,INTENT(IN)::n_plots LOGICAL,OPTIONAL::tex_mode CHARACTER(LEN=*),OPTIONAL,INTENT(IN)::x_label,y_label,z_label CHARACTER(LEN=*),DIMENSION(:),OPTIONAL,INTENT(IN)::plot_title CHARACTER(LEN=3),OPTIONAL,INTENT(IN)::tick_labels CHARACTER(LEN=2),OPTIONAL,INTENT(IN)::legend_position OPTIONAL::my_func INTERFACE SUBROUTINE my_func(level) INTEGER,INTENT(IN)::level END SUBROUTINE my_func END INTERFACE INTEGER::line,n_digits LOGICAL::use_tex n_digits=1 use_tex=.TRUE. IF(PRESENT(n_plots))max_legend_lines=n_plots IF(PRESENT(tex_mode))use_tex=tex_mode IF(PRESENT(file))CALL SETFIL(file) IF(PRESENT(legend_position))THEN SELECT CASE(legend_position) CASE("LL") leg_pos=5 CASE("LR") leg_pos=6 CASE("UR") leg_pos=7 CASE("UL") leg_pos=8 ENDSELECT END IF IF(PRESENT(file_type))THEN CALL METAFL(file_type) ELSE CALL METAFL("CONS") END IF CALL SCRMOD("REVERS") CALL SETPAG("PS4L") IF(PRESENT(my_func))CALL my_func(0) CALL DISINI CALL CENTER CALL PAGERA CALL DISALF CALL COMPLX CALL NOCHEK CALL WINKEY("RETURN") CALL WINKEY("ESCAPE") IF(use_tex)THEN CALL TEXMOD("ON") ELSE CALL TEXMOD("OFF") CALL MIXALF CALL SETMIX('_',"IND") CALL SETMIX('^',"EXP") CALL SETMIX('$',"RES") CALL SETMIX('/',"LEG") END IF new_plot=.TRUE. IF(PRESENT(x_label))CALL NAME(x_label,'X') IF(PRESENT(y_label))CALL NAME(y_label,'Y') IF(PRESENT(z_label))CALL NAME(z_label,'Z') IF(PRESENT(plot_title))THEN DO line=1,SIZE(plot_title) CALL TITLIN(plot_title(line),line) END DO END IF IF(PRESENT(tick_labels))THEN n_ticks=MAX(1,MIN(IACHAR(tick_labels(1:1))-48,9)) n_digits=MAX(0,MIN(IACHAR(tick_labels(3:3))-48,9)) CALL LABDIG(n_digits,"XYZ") SELECT CASE(tick_labels(2:2)) CASE('D') CALL LABELS("EXP","XYZ") CASE('E') CALL LABELS("FEXP","XYZ") CASE('F') CALL LABELS("FLOAT","XYZ") ENDSELECT ELSE CALL LABDIG(n_digits,"XYZ") CALL LABELS("FLOAT","XYZ") END IF CALL LEGINI(Leg,max_legend_lines,50) CALL FRAME(0) CALL MIXLEG CALL LEGTIT("") IF(PRESENT(my_func))CALL my_func(1) END SUBROUTINE SUBROUTINE EndGraphics(my_func) OPTIONAL::my_func INTERFACE SUBROUTINE my_func(level) INTEGER,INTENT(IN)::level END SUBROUTINE my_func END INTERFACE INTEGER::line CALL SETVLT("SMALL") CALL SETCLR(1) DO line=n_legend_lines+1,max_legend_lines CALL LEGPAT(-1,1,-1,-1,-1,line) CALL LEGLIN(Leg,"",line) END DO CALL LEGEND(Leg,leg_pos) IF(PRESENT(my_func))CALL my_func(-1) CALL DISFIN new_plot=.TRUE. n_legend_lines=0 n_ticks=5 max_legend_lines=10 leg_pos=8 Leg="" END SUBROUTINE EndGraphics SUBROUTINE Plot2D_r_sp(x,y,plot_spec,legend,symbol_spec,line_spec,color_spec,axis,my_func) REAL(KIND=r_sp),DIMENSION(:),INTENT(IN),OPTIONAL::x REAL(KIND=r_sp),DIMENSION(:),INTENT(IN),OPTIONAL::y CHARACTER(LEN=3),INTENT(IN),OPTIONAL::plot_spec CHARACTER(LEN=*),INTENT(IN),OPTIONAL::legend INTEGER,DIMENSION(2),INTENT(IN),OPTIONAL::symbol_spec,line_spec,color_spec REAL(KIND=r_sp),DIMENSION(4),INTENT(IN),OPTIONAL::axis OPTIONAL::my_func INTERFACE SUBROUTINE my_func(level) INTEGER,INTENT(IN)::level END SUBROUTINE my_func END INTERFACE INTEGER::point INTEGER::sym_type,sym_size,line_type,line_size,color_table,color_indx REAL(KIND=r_sp),PARAMETER::one=1.0_r_sp,zero=0.0_r_sp REAL(KIND=r_sp)::min_x=zero,max_x=one,min_y=zero,max_y=one,len_x,len_y CHARACTER(LEN=5),DIMENSION(0:7),PARAMETER::color_tables=(/"SMALL","VGA ","RAIN ","SPEC ","GREY ","RRAIN","RSPEC","RGREY"/) LOGICAL::plot_symbols,plot_lines sym_type=15; sym_size=20; line_type=0; line_size=1; color_table=0; color_indx=4 plot_symbols=.FALSE.; plot_lines=.FALSE. IF(PRESENT(x))THEN IF(.NOT.PRESENT(y).OR.(PRESENT(y).AND.(SIZE(y)/=SIZE(x))))THEN RETURN END IF END IF String_spec:IF(PRESENT(plot_spec))THEN Plot_choice:SELECT CASE(plot_spec(1:1)) CASE('S') plot_symbols=.TRUE. Symbol_choice:SELECT CASE(plot_spec(2:2)) CASE('S') sym_type=0 CASE('C') sym_type=1 CASE('T') sym_type=2 CASE('D') sym_type=5 CASE('N') sym_type=6 CASE('s') sym_type=16 CASE('c') sym_type=21 CASE('t') sym_type=20 CASE('d') sym_type=19 CASE('n') sym_type=20 CASE('+') sym_type=3 CASE('x','X') sym_type=4 CASE('*') sym_type=8 ENDSELECT Symbol_choice CASE('L') plot_lines=.TRUE. Line_choice:SELECT CASE(plot_spec(2:2)) CASE('-') line_type=0 CASE('.') line_type=1 CASE(':') line_type=4 CASE('~') line_type=7 CASE('|') line_type=5 CASE('=') line_type=3 ENDSELECT Line_choice ENDSELECT Plot_choice Color_choice:SELECT CASE(plot_spec(3:3)) CASE('R') color_indx=2 CASE('B') color_indx=4 CASE('G') color_indx=3 CASE('Y') color_indx=5 CASE('O') color_indx=6 CASE('C') color_indx=7 CASE('M') color_indx=8 CASE('K') color_indx=1 ENDSELECT Color_choice END IF String_spec IF(PRESENT(symbol_spec))THEN plot_symbols=.TRUE. sym_type=MAX(0,MIN(symbol_spec(1),21)) sym_size=MAX(1,MIN(symbol_spec(2),100)) END IF IF(PRESENT(line_spec))THEN plot_lines=.TRUE. line_type=MAX(0,MIN(line_spec(1),7)) line_size=MAX(1,MIN(line_spec(2),25)) END IF IF(PRESENT(color_spec))THEN color_table=MAX(0,MIN(color_spec(1),7)) color_indx=MAX(0,MIN(color_spec(2),255)) END IF IF(new_plot)THEN IF(.NOT.PRESENT(axis))THEN IF(PRESENT(x).AND.PRESENT(y))THEN min_x=MINVAL(x) max_x=MAXVAL(x) min_y=MINVAL(y) max_y=MAXVAL(y) END IF ELSE min_x=axis(1) max_x=axis(2) min_y=axis(3) max_y=axis(4) END IF len_x=max_x-min_x len_y=max_y-min_y CALL GRAF(REAL(min_x-len_x/20,r_sg),REAL(max_x+len_x/20,r_sg),& REAL(min_x,r_sg),REAL(len_x/n_ticks,r_sg),& REAL(min_y-len_y/20,r_sg),REAL(max_y+len_y/20,r_sg),& REAL(min_y,r_sg),REAL(len_y/n_ticks,r_sg)) CALL TITLE new_plot=.FALSE. END IF IF(PRESENT(my_func))CALL my_func(2) IF(plot_symbols.OR.plot_lines)THEN CALL SETVLT(color_tables(color_table)) CALL SETCLR(color_indx) n_legend_lines=n_legend_lines+1 IF(plot_symbols.AND.(.NOT.plot_lines))THEN CALL LEGPAT(-1,line_size,sym_type,color_indx,-1,n_legend_lines) ELSEIF((.NOT.plot_symbols).AND.plot_lines)THEN CALL LEGPAT(line_type,line_size,-1,color_indx,-1,n_legend_lines) ELSEIF(plot_symbols.AND.plot_lines)THEN CALL LEGPAT(line_type,line_size,sym_type,color_indx,-1,n_legend_lines) END IF IF(PRESENT(legend))CALL LEGLIN(Leg,legend,n_legend_lines) END IF IF(plot_symbols)THEN CALL HSYMBL(sym_size) DO point=1,SIZE(x) CALL RLSYMB(sym_type,REAL(x(point),r_sg),REAL(y(point),r_sg)) END DO END IF IF(plot_lines)THEN CALL LINTYP(line_type) CALL LINWID(line_size) DO point=1,SIZE(x)-1 CALL RLINE(REAL(x(point),r_sg),REAL(y(point),r_sg),& REAL(x(point+1),r_sg),REAL(y(point+1),r_sg)) END DO CALL LINWID(1) END IF END SUBROUTINE SUBROUTINE Plot2D_r_dp(x,y,plot_spec,legend,symbol_spec,line_spec,color_spec,axis,my_func) REAL(KIND=r_dp),DIMENSION(:),INTENT(IN),OPTIONAL::x REAL(KIND=r_dp),DIMENSION(:),INTENT(IN),OPTIONAL::y CHARACTER(LEN=3),INTENT(IN),OPTIONAL::plot_spec CHARACTER(LEN=*),INTENT(IN),OPTIONAL::legend INTEGER,DIMENSION(2),INTENT(IN),OPTIONAL::symbol_spec,line_spec,color_spec REAL(KIND=r_dp),DIMENSION(4),INTENT(IN),OPTIONAL::axis OPTIONAL::my_func INTERFACE SUBROUTINE my_func(level) INTEGER,INTENT(IN)::level END SUBROUTINE my_func END INTERFACE INTEGER::point INTEGER::sym_type,sym_size,line_type,line_size,color_table,color_indx REAL(KIND=r_dp),PARAMETER::one=1.0_r_dp,zero=0.0_r_dp REAL(KIND=r_dp)::min_x=zero,max_x=one,min_y=zero,max_y=one,len_x,len_y CHARACTER(LEN=5),DIMENSION(0:7),PARAMETER::color_tables=(/"SMALL","VGA ","RAIN ","SPEC ","GREY ","RRAIN","RSPEC","RGREY"/) LOGICAL::plot_symbols,plot_lines sym_type=15; sym_size=20; line_type=0; line_size=1; color_table=0; color_indx=4 plot_symbols=.FALSE.; plot_lines=.FALSE. IF(PRESENT(x))THEN IF(.NOT.PRESENT(y).OR.(PRESENT(y).AND.(SIZE(y)/=SIZE(x))))THEN RETURN END IF END IF String_spec:IF(PRESENT(plot_spec))THEN Plot_choice:SELECT CASE(plot_spec(1:1)) CASE('S') plot_symbols=.TRUE. Symbol_choice:SELECT CASE(plot_spec(2:2)) CASE('S') sym_type=0 CASE('C') sym_type=1 CASE('T') sym_type=2 CASE('D') sym_type=5 CASE('N') sym_type=6 CASE('s') sym_type=16 CASE('c') sym_type=21 CASE('t') sym_type=20 CASE('d') sym_type=19 CASE('n') sym_type=20 CASE('+') sym_type=3 CASE('x','X') sym_type=4 CASE('*') sym_type=8 ENDSELECT Symbol_choice CASE('L') plot_lines=.TRUE. Line_choice:SELECT CASE(plot_spec(2:2)) CASE('-') line_type=0 CASE('.') line_type=1 CASE(':') line_type=4 CASE('~') line_type=7 CASE('|') line_type=5 CASE('=') line_type=3 ENDSELECT Line_choice ENDSELECT Plot_choice Color_choice:SELECT CASE(plot_spec(3:3)) CASE('R') color_indx=2 CASE('B') color_indx=4 CASE('G') color_indx=3 CASE('Y') color_indx=5 CASE('O') color_indx=6 CASE('C') color_indx=7 CASE('M') color_indx=8 CASE('K') color_indx=1 ENDSELECT Color_choice END IF String_spec IF(PRESENT(symbol_spec))THEN plot_symbols=.TRUE. sym_type=MAX(0,MIN(symbol_spec(1),21)) sym_size=MAX(1,MIN(symbol_spec(2),100)) END IF IF(PRESENT(line_spec))THEN plot_lines=.TRUE. line_type=MAX(0,MIN(line_spec(1),7)) line_size=MAX(1,MIN(line_spec(2),25)) END IF IF(PRESENT(color_spec))THEN color_table=MAX(0,MIN(color_spec(1),7)) color_indx=MAX(0,MIN(color_spec(2),255)) END IF IF(new_plot)THEN IF(.NOT.PRESENT(axis))THEN IF(PRESENT(x).AND.PRESENT(y))THEN min_x=MINVAL(x) max_x=MAXVAL(x) min_y=MINVAL(y) max_y=MAXVAL(y) END IF ELSE min_x=axis(1) max_x=axis(2) min_y=axis(3) max_y=axis(4) END IF len_x=max_x-min_x len_y=max_y-min_y CALL GRAF(REAL(min_x-len_x/20,r_sg),REAL(max_x+len_x/20,r_sg),& REAL(min_x,r_sg),REAL(len_x/n_ticks,r_sg),& REAL(min_y-len_y/20,r_sg),REAL(max_y+len_y/20,r_sg),& REAL(min_y,r_sg),REAL(len_y/n_ticks,r_sg)) CALL TITLE new_plot=.FALSE. END IF IF(PRESENT(my_func))CALL my_func(2) IF(plot_symbols.OR.plot_lines)THEN CALL SETVLT(color_tables(color_table)) CALL SETCLR(color_indx) n_legend_lines=n_legend_lines+1 IF(plot_symbols.AND.(.NOT.plot_lines))THEN CALL LEGPAT(-1,line_size,sym_type,color_indx,-1,n_legend_lines) ELSEIF((.NOT.plot_symbols).AND.plot_lines)THEN CALL LEGPAT(line_type,line_size,-1,color_indx,-1,n_legend_lines) ELSEIF(plot_symbols.AND.plot_lines)THEN CALL LEGPAT(line_type,line_size,sym_type,color_indx,-1,n_legend_lines) END IF IF(PRESENT(legend))CALL LEGLIN(Leg,legend,n_legend_lines) END IF IF(plot_symbols)THEN CALL HSYMBL(sym_size) DO point=1,SIZE(x) CALL RLSYMB(sym_type,REAL(x(point),r_sg),REAL(y(point),r_sg)) END DO END IF IF(plot_lines)THEN CALL LINTYP(line_type) CALL LINWID(line_size) DO point=1,SIZE(x)-1 CALL RLINE(REAL(x(point),r_sg),REAL(y(point),r_sg),& REAL(x(point+1),r_sg),REAL(y(point+1),r_sg)) END DO CALL LINWID(1) END IF END SUBROUTINE END MODULE Simple_Graphics