summaryrefslogtreecommitdiff
path: root/c++/write_vtk.hpp
blob: 7bde854a0a1f879521bc625af34060759a4826c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once

#include <forstio/error.hpp>

namespace kel {
namespace lbm {
namespace impl {

template<typename... MemberTypes, saw::string_literal... MemberNames>
struct lbm_vtk_writer<sch::Struct<MemberTypes,MemberNames>...> {

	saw::error_or<void> apply(){
		return saw::make_void();
	}
};

template<typename CellFieldSchema>
struct lbm_vtk_writer {
};

template<typename Desc, typename... StructT, saw::string_literal... StructN>
struct lbm_vtk_writer<CellField<Desc,Struct<Member<StructT,StructN>...>>> {
	template<uint64_t i>
	saw::error_or<void> write_i(std::ofstream& vtk_file, const saw::data<CellField<Desc,Struct<Member<StructT,StructN>...>>>& field){

		// vtk_file<<

		return saw::make_void();
	}

	template<uint64_t i>
	saw::error_or<void> iterate_i(std::ofstream& vtk_file, const saw::data<CellField<Desc,Struct<Member<StructT,StructN>...>>>& field){
		{
			auto eov = write_i<i>(vtk_file, field);
			if(eov.is_error()){
				return eov;
			}
		}
		if constexpr ( (i+1u) < sizeof...(StructT) ){
			return iterate_i<i+1u>(vtk_file, field);
		}
		return saw::make_void();
	}

	saw::error_or<void> apply(std::ofstream& vtk_file, 
		const saw::data<CellField<Desc,Struct<Member<StructT,StructN>...>>>& field){
		
		auto meta = field.meta();
		// DIMENSIONS
		{
			vtk_file << "DIMENSIONS ";
			for(saw::data<sch::UInt64> i{0u}; i < Desc::D; ++i){
				vtk_file << " " << meta.at(i).get(); 
			}
			for(saw::data<sch::UInt64> i{Desc::D}; i < 3u; ++i){
				vtk_file << " 1";
			}

			vtk_file << "\n";
		}

		// HEADER TO BODY 
		{
			vtk_file << "\n";
		}

		if constexpr (sizeof...(StructT) > 0u){
			return iterate_i<0u>(vtk_file, field);
		}

		return saw::make_void();
	}
};
}

template<typename Struct>
saw::error_or<void> write_vtk(const std::string_view file_name, const saw::data<Struct>& field){

	std::string vtk_file_name{file_name};
	std::ofstream vtk_file{vtk_file_name};

	if(!vtk_file.is_open()){
		return saw::make_error<saw::err::critical>("Could not open file.");
	}

	vtk_file
		<<"# vtk DataFile Version 3.0\n"
		<<"LBM File\n"
		<<"ASCII\n"
		<<"DATASET STRUCTURED POINTS\n"
		<<"SPACING 1.0 1.0 1.0\n"
		<<"ORIGIN 0.0 0.0 0.0\n"
	;


	auto eov = lbm_vtk_writer::apply(vtk_file, field);
	return eov;
	/*
	vtk_file <<"# vtk DataFile Version 3.0\n";
	vtk_file <<"Velocity Cavity2D example\n";
	vtk_file <<"ASCII\n";
	vtk_file <<"DATASET STRUCTURED_POINTS\n";
	vtk_file <<"DIMENSIONS "<< dim_x <<" "<<dim_y<<" 1\n";
	vtk_file <<"SPACING 1.0 1.0 1.0\n";
	vtk_file <<"ORIGIN 0.0 0.0 0.0\n";
	vtk_file <<"POINT_DATA "<<(dim_x*dim_y)<<"\n";
	vtk_file <<"VECTORS Velocity float\n";
	*/
:w
}
}
}