| 1 | /* | 
| 2 |  * amr_base_unit_test.cpp | 
| 3 |  * | 
| 4 |  *  Created on: Oct 5, 2017 | 
| 5 |  *      Author: i-bird | 
| 6 |  */ | 
| 7 | #define BOOST_TEST_DYN_LINK | 
| 8 | #include <boost/test/unit_test.hpp> | 
| 9 |  | 
| 10 | #include "Grid/grid_dist_id.hpp" | 
| 11 | #include "Point_test.hpp" | 
| 12 | #include "Grid/tests/grid_dist_id_util_tests.hpp" | 
| 13 |  | 
| 14 | BOOST_AUTO_TEST_SUITE( amr_grid_dist_id_test ) | 
| 15 |  | 
| 16 |  | 
| 17 | BOOST_AUTO_TEST_CASE( grid_dist_id_amr ) | 
| 18 | { | 
| 19 | 	// Domain | 
| 20 | 	Box<2,float> domain2({0.0,0.0},{1.0,1.0}); | 
| 21 |  | 
| 22 | 	size_t sz[2] = {100,100}; | 
| 23 |  | 
| 24 | 	// Ghost | 
| 25 | 	Ghost<2,long int> g(1); | 
| 26 |  | 
| 27 | 	// periodicity | 
| 28 | 	periodicity<2> pr = {{PERIODIC,PERIODIC}}; | 
| 29 |  | 
| 30 | 	openfpm::vector<Box<2,long int>> C_draw; | 
| 31 | 	C_draw.add(Box<2,long int>({20,20},{50,24})); | 
| 32 | 	C_draw.add(Box<2,long int>({51,20},{60,24})); | 
| 33 | 	C_draw.add(Box<2,long int>({61,20},{70,24})); | 
| 34 | 	C_draw.add(Box<2,long int>({20,25},{24,66})); | 
| 35 | 	C_draw.add(Box<2,long int>({15,67},{49,85})); | 
| 36 | 	C_draw.add(Box<2,long int>({50,76},{70,81})); | 
| 37 | 	C_draw.add(Box<2,long int>({30,25},{34,37})); | 
| 38 | 	C_draw.add(Box<2,long int>({50,66},{70,70})); | 
| 39 |  | 
| 40 | 	size_t volume_key = 0; | 
| 41 | 	for (size_t i = 0 ; i < C_draw.size() ; i++) | 
| 42 | 	{ | 
| 43 | 		volume_key += Box<2,long int>(C_draw.get(i)).getVolumeKey(); | 
| 44 | 	} | 
| 45 |  | 
| 46 | 	// Distributed grid with id decomposition | 
| 47 | 	grid_dist_id<2,float,Point_test<float>> g_dist(sz,domain2,g,pr,C_draw); | 
| 48 |  | 
| 49 | 	// fill with gkey | 
| 50 |  | 
| 51 | 	auto git = g_dist.getDomainIterator(); | 
| 52 | 	grid_sm<2,void> gs(sz); | 
| 53 |  | 
| 54 | 	size_t count = 0; | 
| 55 |  | 
| 56 | 	while (git.isNext()) | 
| 57 | 	{ | 
| 58 | 		auto key = git.get(); | 
| 59 | 		auto gkey = git.getGKey(key); | 
| 60 |  | 
| 61 | 		g_dist.template get<0>(key) = gs.LinId(gkey); | 
| 62 |  | 
| 63 | 		count++; | 
| 64 |  | 
| 65 | 		++git; | 
| 66 | 	} | 
| 67 |  | 
| 68 | 	Vcluster<> & vcl = create_vcluster(); | 
| 69 |  | 
| 70 | 	vcl.sum(count); | 
| 71 | 	vcl.execute(); | 
| 72 |  | 
| 73 | 	BOOST_REQUIRE_EQUAL(count,volume_key); | 
| 74 |  | 
| 75 | 	g_dist.ghost_get<0>(); | 
| 76 |  | 
| 77 | 	// Check it is correct | 
| 78 |  | 
| 79 | 	bool check = true; | 
| 80 | 	size_t check_count = 0; | 
| 81 |  | 
| 82 | 	auto git2 = g_dist.getDomainGhostIterator(); | 
| 83 | 	while (git2.isNext()) | 
| 84 | 	{ | 
| 85 | 		auto key = git2.get(); | 
| 86 | 		auto gkey = git2.getGKey(key); | 
| 87 |  | 
| 88 | 		float value = g_dist.template get<0>(key); | 
| 89 |  | 
| 90 | 		// check if the point is inside or outside the domain | 
| 91 |  | 
| 92 | 		for (size_t k = 0; k < C_draw.size() ; k++) | 
| 93 | 		{ | 
| 94 | 			if (Box<2,long int>(C_draw.get(k)).isInside(gkey.toPoint()) == true) | 
| 95 | 			{ | 
| 96 | 				check &= value == gs.LinId(gkey); | 
| 97 |  | 
| 98 | 				// get the gdb_ext | 
| 99 | 				auto & gdb_ext = g_dist.getLocalGridsInfo(); | 
| 100 |  | 
| 101 | 				for (size_t s = 0 ; s < gdb_ext.size() ; s++) | 
| 102 | 				{ | 
| 103 | 					Box<2,long int> bx = gdb_ext.get(s).Dbox; | 
| 104 | 					bx += gdb_ext.get(s).origin; | 
| 105 | 					if (bx.isInside(gkey.toPoint())) | 
| 106 | 					{ | 
| 107 | 						check_count++; | 
| 108 | 						break; | 
| 109 | 					} | 
| 110 | 				} | 
| 111 | 				break; | 
| 112 | 			} | 
| 113 | 		} | 
| 114 |  | 
| 115 | 		++git2; | 
| 116 | 	} | 
| 117 |  | 
| 118 | 	vcl.sum(check_count); | 
| 119 | 	vcl.execute(); | 
| 120 |  | 
| 121 | 	BOOST_REQUIRE_EQUAL(check,true); | 
| 122 | 	BOOST_REQUIRE(check_count >= volume_key); | 
| 123 | } | 
| 124 |  | 
| 125 | BOOST_AUTO_TEST_CASE( amr_grid_dist_id_iterator_test_use_2D) | 
| 126 | { | 
| 127 | 	// Domain | 
| 128 | 	Box<2,float> domain({0.0,0.0},{1.0,1.0}); | 
| 129 |  | 
| 130 | #ifdef TEST_COVERAGE_MODE | 
| 131 | 	long int k = 256*256*create_vcluster().getProcessingUnits(); | 
| 132 | #else | 
| 133 | 	long int k = 1024*1024*create_vcluster().getProcessingUnits(); | 
| 134 | #endif | 
| 135 | 	k = std::pow(k, 1/2.); | 
| 136 |  | 
| 137 | 	long int big_step = k / 30; | 
| 138 | 	big_step = (big_step == 0)?1:big_step; | 
| 139 | 	long int small_step = 21; | 
| 140 |  | 
| 141 | 	print_test( "AMR Testing 2D full grid k<=" ,k); | 
| 142 |  | 
| 143 | 	// 2D test | 
| 144 | 	for ( ; k >= 2 ; k-= (k > 2*big_step)?big_step:small_step ) | 
| 145 | 	{ | 
| 146 | 		BOOST_TEST_CHECKPOINT( "AMR Testing 2D full grid k="  << k ); | 
| 147 |  | 
| 148 | 		//! [Create and access a distributed grid] | 
| 149 |  | 
| 150 | 		// grid size | 
| 151 | 		size_t sz[2]; | 
| 152 | 		sz[0] = k; | 
| 153 | 		sz[1] = k; | 
| 154 |  | 
| 155 | 		// periodicity | 
| 156 | 		periodicity<2> pr = {{PERIODIC,PERIODIC}}; | 
| 157 |  | 
| 158 | 		// Ghost | 
| 159 | 		Ghost<2,long int> g(1); | 
| 160 |  | 
| 161 | 		openfpm::vector<Box<2,long int>> bx_def; | 
| 162 | 		bx_def.add(Box<2,long int>({0,0},{k-1,k-1})); | 
| 163 |  | 
| 164 | 		// Distributed grid with id decomposition | 
| 165 | 		grid_dist_id<2, float, aggregate<double>> g_dist(sz,domain,g,pr,bx_def); | 
| 166 |  | 
| 167 | 		Test2D_core(g_dist,sz,k); | 
| 168 | 	} | 
| 169 | } | 
| 170 |  | 
| 171 | BOOST_AUTO_TEST_SUITE_END() | 
| 172 |  |