;; (C)  2023
;;  Stefan Pirker
;;  Particulate Flow Modelling
;;  Johannes Kepler University, Linz, Austria
;;  www.particulate-flow.at 


(define rCFD_src_dir  "../../src")

(define rCFD_user_src_dir  "./user_src")

(define rCFD_data_scratch_dir  "/scratch/k3b02/k3b1570/rCFD_data/tutorials/fluidized_bed_segregation")

(define rCFD_data_case_dir "I120_114")

(define rCFD_data_case "PD2_asBD")

(define rCFD_post_case "BD_J")

(define ANSYS_Fluent_case_dir "./ansys_fluent")

(define ANSYS_Fluent_case_file  "quad_80k")

(define number_of_CFD_episodes 1050)

(define simulation_timestep_width 0.005)

(define number_of_timesteps_per_episode 1)

(define i_run 0)

(define start_index 0)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P1)       ;; load all you need in tutorial's main folder
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string (format  #f "!cp ~a/~a.cas.h5 ." ANSYS_Fluent_case_dir ANSYS_Fluent_case_file))    
    (ti-menu-load-string (format  #f "!cp ~a/~a.dat.h5 ." ANSYS_Fluent_case_dir ANSYS_Fluent_case_file))    
            
    (ti-menu-load-string (format  #f "!cp ~a/*.h ." rCFD_user_src_dir))
    
    (ti-menu-load-string (format  #f "!cp ~a/*.c ."    rCFD_src_dir))
    (ti-menu-load-string (format  #f "!cp ~a/*.h ."    rCFD_src_dir))

    (ti-menu-load-string "!rm -r libudf_rcfd_prep")
    
    (ti-menu-load-string "!rm rCFD_prep.trn")
)   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P2)       ;; load ip files, use specific settings for jump prepare
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string "!mkdir ./data")
    
    (ti-menu-load-string "!mkdir ./data/ip")
    
    (ti-menu-load-string "!rm ./data/ip/*.ip")
    
    (ti-menu-load-string (format  #f "!cp ~a/~a~a/ip/*.ip ./data/ip/ " rCFD_data_scratch_dir rCFD_data_case_dir rCFD_data_case))  
)

;; fluent_has_compiled lets the compile-scheme know if any udf has already been compiled
;; to enable recompilation
(if (not (symbol-bound? 'fluent_has_compiled (the-environment)))
    (begin
        (define fluent_has_compiled #f)
        (define fluent_has_compiled_headers #f)
    )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_p3)       ;; compile everything into libudf_rcfd_prep
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string "!rm -r libudf_rcfd_prep")

    ;; load compile scheme
    (load (format  #f "~a/rCFD_C2C_prep_compile.scm" rCFD_src_dir) )

    (ti-menu-load-string "!rm  ./*.c")
    (ti-menu-load-string "!rm  ./*.h")
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P4)       ;; load start file, allocate UDMI's and init rCFD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string (format #f "/file/read-case-data ./~a.cas.h5 OK" ANSYS_Fluent_case_file))
    
    (ti-menu-load-string "/define/user-defined/user-defined-memory 30 q" )
	
	(ti-menu-load-string "/define/user-defined/user-defined-node-memory 2 q" )
    
    (ti-menu-load-string "/define/user-defined/compiled-functions load \"libudf_rcfd_prep\"")
    
    (ti-menu-load-string "/define/user-defined/execute-on-demand \"rCFD_init_all::libudf_rcfd_prep\"")
	
	(ti-menu-load-string "/define/user-defined/execute-on-demand \"rCFD_write_Topo::libudf_rcfd_prep\"")
)

    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_p5)       ;; settings for calibration
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string "/define/user-defined/user-defined-scalars 
        6 no no
        phase-1 yes \"mass flow rate\" \"default\"
        phase-1 yes \"mass flow rate\" \"default\"
        phase-1 yes \"mass flow rate\" \"default\"
        phase-2 yes \"mass flow rate\" \"default\"
        phase-2 yes \"mass flow rate\" \"default\"
        phase-2 yes \"mass flow rate\" \"default\"")
		
    (ti-menu-load-string "/define/materials/change-create ph_gas ph_gas
        no no no no no no
        yes defined-per-uds
        0 constant 1e-10
        1 constant 1e-10
        2 constant 1e-10
        -1
        no")

    (ti-menu-load-string "/define/materials/change-create ph_solid ph_solid
        no no no no no no
        yes defined-per-uds
        3 constant 1e-10
        4 constant 1e-10
        5 constant 1e-10
        -1
        no")		
        
    (ti-menu-load-string "/solve/set/discretization-scheme/
        uds-0 1
        uds-1 1
        uds-2 1
        uds-3 1
        uds-4 1
        uds-5 1")		
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P6)       ;; run fluent simulations for monitoring C2C paths and norms,
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   (ti-menu-load-string "/define/user-defined/function-hooks/execute-at-end
		\"rCFD_execute_at_end::libudf_rcfd_prep\"
        \"\""
    )

    (do  ((i_run  0 (+ i_run  1)))
        ((= i_run  number_of_CFD_episodes))
        
        (ti-menu-load-string (format #f "!cp ./data/ip/~04d.ip ./data.ip" (+ i_run start_index)))
        (ti-menu-load-string "/file/interpolate/read-data yes data.ip")

        (ti-menu-load-string (format #f "/solve/set/time-step ~d" simulation_timestep_width)) 
        (ti-menu-load-string (format #f "/solve/dual-time-iterate ~d 20" number_of_timesteps_per_episode))
    )
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P7)       ;; analyze and write recurrence path,
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    (ti-menu-load-string "/define/user-defined/execute-on-demand \"rCFD_write_Rec::libudf_rcfd_prep\"")
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P8)       ;; free memory, archive data to scratch, delete injection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string "/define/user-defined/execute-on-demand \"rCFD_free_all::libudf_rcfd_prep\"")
    
    (ti-menu-load-string (format  #f "!mkdir ~a/~a~a" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))
    
    (ti-menu-load-string (format  #f "!mkdir ~a/~a~a/c2c" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))     
    
    (ti-menu-load-string (format  #f "!cp ./data/c2c/* ~a/~a~a/c2c/" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))      
    
    (ti-menu-load-string (format  #f "!mkdir ~a/~a~a/tmp" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))     
    
    (ti-menu-load-string (format  #f "!cp ./data/tmp/* ~a/~a~a/tmp/" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))      
    
    (ti-menu-load-string (format  #f "!mkdir ~a/~a~a/vof" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))     

    (ti-menu-load-string (format  #f "!cp ./data/vof/* ~a/~a~a/vof/" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))          
    
    (ti-menu-load-string (format  #f "!mkdir ~a/~a~a/rec" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))     

    (ti-menu-load-string (format  #f "!cp ./data/rec/* ~a/~a~a/rec/ " rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))

    (ti-menu-load-string (format  #f "!cp ./rCFD_prep.trn ~a/~a~a/" rCFD_data_scratch_dir rCFD_data_case_dir rCFD_post_case))               
    
    (ti-menu-load-string "/define/injections/delete-injection rcfd_tracer")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_P9)      ;; clean-up folder
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (ti-menu-load-string "!rm  ./*.c")
    (ti-menu-load-string "!rm  ./*.h")
    (ti-menu-load-string "!rm  ./*.h5") 
    (ti-menu-load-string "!rm  ./*.tiff")
    (ti-menu-load-string "!rm  ./*.tif")
    (ti-menu-load-string "!rm  ./*.trn")
    (ti-menu-load-string "!rm  ./fluent*")
    (ti-menu-load-string "!rm  ./log")
)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_prep_replay)      ;; generate rCFD database for replay (i.e. database with 496 frames)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (set! ANSYS_Fluent_case_file  "quad_80k")
	
	(set! rCFD_data_case_dir "I110_114")

    (set! rCFD_data_case "PD2_asBD")

    (set! rCFD_post_case "PD2_asBD")
    
    (set! number_of_CFD_episodes 1050)
    
    (set! start_index 0)
    
    (rCFD_P1)
    (rCFD_P2)
        
    (ti-menu-load-string "!mv rCFD_user_replay_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9)

    (set! ANSYS_Fluent_case_file  "quad_80k")
	
	(set! rCFD_data_case_dir "I110_114")

    (set! rCFD_data_case "PD4_asBD")

    (set! rCFD_post_case "PD4_asBD")
    
    (set! number_of_CFD_episodes 1050)
    
    (set! start_index 0)
    
    (rCFD_P1)
    (rCFD_P2)
        
    (ti-menu-load-string "!mv rCFD_user_replay_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9)

    (set! ANSYS_Fluent_case_file  "quad_80k")
	
	(set! rCFD_data_case_dir "I120_114")

    (set! rCFD_data_case "PD2_asBD")

    (set! rCFD_post_case "PD2_asBD")
    
    (set! number_of_CFD_episodes 1050)
    
    (set! start_index 0)
    
    (rCFD_P1)
    (rCFD_P2)
   
    (ti-menu-load-string "!mv rCFD_user_replay_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9)
    
    (set! ANSYS_Fluent_case_file  "quad_80k")
	
	(set! rCFD_data_case_dir "I120_114")

    (set! rCFD_data_case "PD4_asBD")

    (set! rCFD_post_case "PD4_asBD")
    
    (set! number_of_CFD_episodes 1050)
    
    (set! start_index 0)
    
    (rCFD_P1)
    (rCFD_P2)

    (ti-menu-load-string "!mv rCFD_user_replay_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_prep_jump)        ;; generate rCFD database for jump (i.e. database with 150 frames)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    (set! rCFD_data_case_dir "I110_114")

    (set! rCFD_data_case "PD2_asBD")              ;; or "MS" (in case MS simulation is used as database)

    (set! rCFD_post_case "PD2_asBD_J")            ;; or "MS_J"
    
    (set! number_of_CFD_episodes 350)             ;; > 300
    
    (set! start_index 696)                        ;; 996 - 300
    
    (rCFD_P1)
    (rCFD_P2)
        
    (ti-menu-load-string "!mv rCFD_user_jump_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8)
    ;;(rCFD_P9) 

    (set! rCFD_data_case_dir "I110_114")

    (set! rCFD_data_case "PD4_asBD")              ;; or "MS" (in case MS simulation is used as database)

    (set! rCFD_post_case "PD4_asBD_J")            ;; or "MS_J"
    
    (set! number_of_CFD_episodes 350)             ;; > 300
    
    (set! start_index 696)                        ;; 996 - 300
    
    (rCFD_P1)
    (rCFD_P2)

    (ti-menu-load-string "!mv rCFD_user_jump_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9) 

	    
    (set! rCFD_data_case_dir "I120_114")

    (set! rCFD_data_case "PD2_asBD")              ;; or "MS" (in case MS simulation is used as database)

    (set! rCFD_post_case "PD2_asBD_J")            ;; or "MS_J"
    
    (set! number_of_CFD_episodes 350)             ;; > 300
    
    (set! start_index 696)                        ;; 996 - 300
    
    (rCFD_P1)
    (rCFD_P2)
        
    (ti-menu-load-string "!mv rCFD_user_jump_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9) 

    (set! rCFD_data_case_dir "I120_114")

    (set! rCFD_data_case "PD4_asBD")              ;; or "MS" (in case MS simulation is used as database)

    (set! rCFD_post_case "PD4_asBD_J")            ;; or "MS_J"
    
    (set! number_of_CFD_episodes 350)             ;; > 300
    
    (set! start_index 696)                        ;; 996 - 300
    
    (rCFD_P1)
    (rCFD_P2)

    (ti-menu-load-string "!mv rCFD_user_jump_prep.h rCFD_user.h")
    
    (rCFD_P3) 
    (rCFD_P4)       
    (rCFD_P5) 
    (rCFD_P6)       
    (rCFD_P7)
    (rCFD_P8) 
    (rCFD_P9) 
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (rCFD_prep_all)         ;; generate rCFD database for replay and jump
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    (rCFD_prep_replay)
    
    (rCFD_prep_jump)
)