mirror of
				https://igit.ific.uv.es/alramos/latticegpu.jl.git
				synced 2025-10-30 22:25:46 +01:00 
			
		
		
		
	Added i/o for configurations in native BDIO format
This commit is contained in:
		
					parent
					
						
							
								afd837e80d
							
						
					
				
			
			
				commit
				
					
						2e71d6c0e1
					
				
			
		
					 4 changed files with 171 additions and 6 deletions
				
			
		|  | @ -32,8 +32,8 @@ Base.zero(::Type{M2x2{T}})   where T <: AbstractFloat = M2x2{T}(zero(T),zero(T), | |||
| Base.one(::Type{SU2{T}})     where T <: AbstractFloat = SU2{T}(one(T),zero(T)) | ||||
| Base.one(::Type{M2x2{T}})    where T <: AbstractFloat = M2x2{T}(one(T),zero(T),zero(T),one(T)) | ||||
| 
 | ||||
| Base.convert(::Type{M2x2{T}}, a::SU3alg{T}) where T = alg2mat(a) | ||||
| Base.convert(::Type{M2x2{T}}, a::SU3{T}) where T = M2x2{T}(a.t1,a.t2,-conj(a.t2), conj(a.t1)) | ||||
| Base.convert(::Type{M2x2{T}}, a::SU2alg{T}) where T = alg2mat(a) | ||||
| Base.convert(::Type{M2x2{T}}, a::SU2{T}) where T = M2x2{T}(a.t1,a.t2,-conj(a.t2), conj(a.t1)) | ||||
| 
 | ||||
| Random.rand(rng::AbstractRNG, ::Random.SamplerType{SU2alg{T}}) where T <: AbstractFloat = SU2alg{T}(randn(rng,T),randn(rng,T),randn(rng,T)) | ||||
| Random.rand(rng::AbstractRNG, ::Random.SamplerType{SU2{T}})    where T <: AbstractFloat = exp(SU2alg{T}(randn(rng,T),randn(rng,T),randn(rng,T))) | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ export Eoft_clover, Eoft_plaq, Qtop | |||
| export FlowIntr, wfl_euler, zfl_euler, wfl_rk2, zfl_rk2, wfl_rk3, zfl_rk3 | ||||
| export flw, flw_adapt | ||||
| export sfcoupling, bndfield, setbndfield | ||||
| export import_lex64, import_cern64, import_bsfqcd | ||||
| export import_lex64, import_cern64, import_bsfqcd, save_cnfg, read_cnfg | ||||
| 
 | ||||
| include("Spinors/Spinors.jl") | ||||
| 
 | ||||
|  |  | |||
|  | @ -147,6 +147,6 @@ include("YMsf.jl") | |||
| export sfcoupling, bndfield, setbndfield | ||||
| 
 | ||||
| include("YMio.jl") | ||||
| export import_lex64, import_cern64, import_bsfqcd | ||||
| export import_lex64, import_cern64, import_bsfqcd, save_cnfg, read_cnfg | ||||
| 
 | ||||
| end | ||||
|  |  | |||
							
								
								
									
										169
									
								
								src/YM/YMio.jl
									
										
									
									
									
								
							
							
						
						
									
										169
									
								
								src/YM/YMio.jl
									
										
									
									
									
								
							|  | @ -10,9 +10,174 @@ | |||
| ###                                | ||||
| 
 | ||||
| """ | ||||
|     function import_lex64(fname::String, lp::SpaceParm) | ||||
|     read_cnfg(U, lp::SpaceParm{4,M,B,D},) | ||||
| 
 | ||||
| import a double precision configuration in lexicographic format. SF boundary conditions are assummed.  | ||||
| Reads configuration from file `fname` using the native (BDIO) format. | ||||
| """ | ||||
| function read_cnfg(fname::String) | ||||
| 
 | ||||
|     UID_HDR = 14 | ||||
|     fb = BDIO_open(fname, "r") | ||||
|     while BDIO_get_uinfo(fb) != UID_HDR | ||||
|         BDIO_seek!(fb) | ||||
|     end | ||||
|     ihdr = Vector{Int32}(undef, 2) | ||||
|     BDIO_read(fb, ihdr) | ||||
|     if (ihdr[1] != convert(Int32, 1653996111)) && (ihdr[2] != convert(Int32, 2)) | ||||
|         error("Wrong file format [header]") | ||||
|     end | ||||
| 
 | ||||
|     run = BDIO.BDIO_read_str(fb) | ||||
| 
 | ||||
|     while BDIO_get_uinfo(fb) != 1 | ||||
|         BDIO_seek!(fb) | ||||
|     end | ||||
| 
 | ||||
|     ifoo = Vector{Int32}(undef, 4) | ||||
|     BDIO_read(fb, ifoo) | ||||
|     ndim = convert(Int64, ifoo[1]) | ||||
|     npls = convert(Int64, round(ndim*(ndim-1)/2)) | ||||
|     ibc  = convert(Int64, ifoo[2]) | ||||
|     nf   = ifoo[4] | ||||
|      | ||||
|     ifoo = Vector{Int32}(undef, ndim+convert(Int32, npls)) | ||||
|     BDIO_read(fb, ifoo) | ||||
|     iL  = ntuple(i -> convert(Int64, ifoo[i]),ndim) | ||||
|     ntw = ntuple(i -> convert(Int64, ifoo[i+ndim]), npls) | ||||
| 
 | ||||
|     dfoo = Vector{Float64}(undef, 4) | ||||
|     BDIO_read(fb, dfoo) | ||||
| 
 | ||||
|     lp = SpaceParm{ndim}(iL, (4,4,4,4), ibc, ntw) | ||||
|     gp = GaugeParm{Float64}(SU3{Float64}, dfoo[1], dfoo[2]) | ||||
|      | ||||
|     dtr = (2,3,4,1) | ||||
|     assign(id, V, i3) = SU3{Float64}(V[1,dtr[id],i3],V[2,dtr[id],i3],V[3,dtr[id],i3], | ||||
|                                      V[4,dtr[id],i3],V[5,dtr[id],i3],V[6,dtr[id],i3]) | ||||
| 
 | ||||
|     while BDIO_get_uinfo(fb) != 8 | ||||
|         BDIO_seek!(fb) | ||||
|     end | ||||
|     Ucpu = Array{SU3{Float64}, 3}(undef, lp.bsz, lp.ndim, lp.rsz) | ||||
|     V = Array{ComplexF64, 3}(undef, 9, lp.ndim, lp.iL[3]) | ||||
|     for i4 in 1:lp.iL[4] | ||||
|         for i1 in 1:lp.iL[1] | ||||
|             for i2 in 1:lp.iL[2] | ||||
|                 BDIO_read(fb, vec(V)) | ||||
|                 for i3 in 1:lp.iL[3] | ||||
|                     b, r = point_index(CartesianIndex(i1,i2,i3,i4), lp) | ||||
|                     for id in 1:lp.ndim | ||||
|                         Ucpu[b,id,r] = assign(id, V, i3) | ||||
|                     end | ||||
|                 end | ||||
|             end | ||||
|         end | ||||
|     end | ||||
| 
 | ||||
|     if ibc == BC_SF_AFWB || ibc == BC_SF_ORBI | ||||
|         BDIO_read(fb, V) | ||||
|         Ubnd = ntuple(i->assign(i, V, 1), 3) | ||||
|         BDIO_close!(fb) | ||||
| 
 | ||||
|         return CuArray(Ucpu), Ubnd | ||||
|     else | ||||
|         BDIO_close!(fb) | ||||
|         return CuArray(Ucpu) | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| """ | ||||
|     save_cnfg(fname, U, lp::SpaceParm, gp::GaugeParm; run::Union{Nothing,String}=nothing) | ||||
| 
 | ||||
| Saves configuration `U` in the file `fname` using the native (BDIO) format. | ||||
| """ | ||||
| function save_cnfg(fname::String, U, lp::SpaceParm{4,M,B,D}, gp::GaugeParm; run::Union{Nothing,String}=nothing) where {M,B,D} | ||||
| 
 | ||||
|     ihdr = [convert(Int32, 1653996111),convert(Int32,2)] | ||||
|     UID_HDR = 14 | ||||
| 
 | ||||
|     if isfile(fname) | ||||
|         fb = BDIO_open(fname, "a") | ||||
|     else | ||||
|         fb = BDIO_open(fname, "w", "Configuration of LatticeGPU.jl") | ||||
|         BDIO_start_record!(fb, BDIO_BIN_GENERIC, UID_HDR) | ||||
|         BDIO_write!(fb, ihdr) | ||||
|         if run != nothing | ||||
|             BDIO_write!(fb, run*"\0") | ||||
|         end | ||||
|         BDIO_write_hash!(fb) | ||||
|          | ||||
|         dfoo = Vector{Float64}(undef, 16) | ||||
|         BDIO_start_record!(fb, BDIO_BIN_GENERIC, 1) | ||||
|         BDIO_write!(fb, [convert(Int32, 4)]) | ||||
|         BDIO_write!(fb, [convert(Int32, B)]) | ||||
|         BDIO_write!(fb, [convert(Int32, gp.ng)]) | ||||
|         BDIO_write!(fb, [convert(Int32, 0)]) | ||||
|         BDIO_write!(fb, [convert(Int32, lp.iL[i]) for i in 1:4]) | ||||
|         BDIO_write!(fb, [convert(Int32, lp.ntw[i]) for i in 1:M]) | ||||
|         BDIO_write!(fb, [gp.beta, gp.c0, gp.cG[1], gp.cG[2]]) | ||||
|     end | ||||
|     BDIO_write_hash!(fb) | ||||
|      | ||||
|     dtr = (2,3,4,1) | ||||
| 
 | ||||
|     function assign!(id, V, i3, M::M3x3{T}) where T | ||||
| 
 | ||||
|         V[1,dtr[id],i3] = M.u11 | ||||
|         V[2,dtr[id],i3] = M.u12 | ||||
|         V[3,dtr[id],i3] = M.u13 | ||||
|         V[4,dtr[id],i3] = M.u21 | ||||
|         V[5,dtr[id],i3] = M.u22 | ||||
|         V[6,dtr[id],i3] = M.u23 | ||||
|         V[7,dtr[id],i3] = M.u31 | ||||
|         V[8,dtr[id],i3] = M.u32 | ||||
|         V[9,dtr[id],i3] = M.u33 | ||||
|         return nothing | ||||
|     end | ||||
|     assign!(id, V, i3, g::SU3{T}) where T = assign!(id,V,i3,convert(M3x3{T}, g)) | ||||
| 
 | ||||
|     BDIO_start_record!(fb, BDIO_BIN_F64LE, 8, true) | ||||
|     Ucpu = Array(U) | ||||
|     V = Array{ComplexF64, 3}(undef, 9, lp.ndim, lp.iL[3]) | ||||
|     for i4 in 1:lp.iL[4] | ||||
|         for i1 in 1:lp.iL[1] | ||||
|             for i2 in 1:lp.iL[2] | ||||
|                 for i3 in 1:lp.iL[3] | ||||
|                     b, r = point_index(CartesianIndex(i1,i2,i3,i4), lp) | ||||
|                     for id in 1:lp.ndim | ||||
|                         assign!(id, V, i3, Ucpu[b,id,r]) | ||||
|                     end | ||||
|                 end | ||||
|                 BDIO_write!(fb, V) | ||||
|             end | ||||
|         end | ||||
|     end | ||||
|      | ||||
|     if B == BC_SF_AFWB || B == BC_SF_ORBI | ||||
|         for i3 in 1:lp.iL[3] | ||||
|             for id in 1:lp.ndim-1 | ||||
|                 assign!(id, V, i3, Ubnd[id]) | ||||
|             end | ||||
|             assign!(4, V, i3, zero(M3x3{Float64})) | ||||
|         end | ||||
|         for i1 in 1:lp.iL[1] | ||||
|             for i2 in 1:lp.iL[2] | ||||
|                 BDIO_write!(fb, V) | ||||
|             end | ||||
|         end | ||||
|     end         | ||||
|     BDIO_write_hash!(fb) | ||||
|     BDIO_close!(fb) | ||||
|      | ||||
|     return nothing | ||||
| end | ||||
| 
 | ||||
| 
 | ||||
| """ | ||||
|     function import_bsfqcd(fname::String, lp::SpaceParm) | ||||
| 
 | ||||
| import a double precision configuration in bsfqcd format. SF boundary conditions are assummed.  | ||||
| """ | ||||
| function import_bsfqcd(fname, lp::SpaceParm) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue