itu_materials.py (10044B)
1 # 2 # SPDX-FileCopyrightText: Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3 # SPDX-License-Identifier: Apache-2.0 4 # 5 """ 6 Instantiates a set of radio materials for the scene objects. 7 These materials are from Table 3 of the Recommendation ITU-R P.2040-2. 8 """ 9 10 import numpy as np 11 from .radio_material import RadioMaterial 12 from . import scene 13 14 def instantiate_itu_materials(dtype): 15 ######################################### 16 # Vacuum (~ air) 17 ######################################### 18 19 def vacuum_properties(f_hz): # pylint: disable=unused-argument 20 return (1.0, 0.0) 21 22 rm = RadioMaterial("vacuum", 23 frequency_update_callback=vacuum_properties, 24 dtype=dtype) 25 scene.Scene().add(rm) 26 27 28 ######################################### 29 # Concrete 30 ######################################### 31 32 def concrete_properties(f_hz): 33 f_ghz = f_hz / 1e9 34 if f_ghz < 1.0 or f_ghz > 100.: 35 return (-1.0, -1.0) 36 37 relative_permittivity = 5.24 38 conductivity = 0.0462*np.power(f_ghz, 0.7822) 39 return (relative_permittivity, conductivity) 40 41 # Materials parameters will be updated when the frequency is set 42 rm = RadioMaterial("itu_concrete", 43 frequency_update_callback=concrete_properties, 44 dtype=dtype) 45 scene.Scene().add(rm) 46 47 ########################################## 48 # Brick 49 ########################################## 50 51 def brick_properties(f_hz): 52 f_ghz = f_hz / 1e9 53 if f_ghz < 1.0 or f_ghz > 40.: 54 return (-1.0, -1.0) 55 56 relative_permittivity = 3.91 57 conductivity = 0.0238*np.power(f_ghz, 0.16) 58 return (relative_permittivity, conductivity) 59 60 # Materials parameters will be updated when the frequency is set 61 rm = RadioMaterial("itu_brick", 62 frequency_update_callback=brick_properties, 63 dtype=dtype) 64 scene.Scene().add(rm) 65 66 ######################################### 67 # Plasterboard 68 ######################################### 69 70 def plasterboard_properties(f_hz): 71 f_ghz = f_hz / 1e9 72 if f_ghz < 1.0 or f_ghz > 100.: 73 return (-1.0, -1.0) 74 75 76 relative_permittivity = 2.73 77 conductivity = 0.0085*np.power(f_ghz, 0.9395) 78 return (relative_permittivity, conductivity) 79 80 # Materials parameters will be updated when the frequency is set 81 rm = RadioMaterial("itu_plasterboard", 82 frequency_update_callback=plasterboard_properties, 83 dtype=dtype) 84 scene.Scene().add(rm) 85 86 ######################################### 87 # Wood 88 ######################################### 89 90 def wood_properties(f_hz): 91 f_ghz = f_hz / 1e9 92 if f_ghz < 0.001 or f_ghz > 100.: 93 return (-1.0, -1.0) 94 95 relative_permittivity = 1.99 96 conductivity = 0.0047*np.power(f_ghz, 1.0718) 97 return (relative_permittivity, conductivity) 98 99 # Materials parameters will be updated when the frequency is set 100 rm = RadioMaterial("itu_wood", 101 frequency_update_callback=wood_properties, 102 dtype=dtype) 103 scene.Scene().add(rm) 104 105 ######################################### 106 # Glass 107 ######################################### 108 109 def glass_properties(f_hz): 110 f_ghz = f_hz / 1e9 111 if 0.1 <= f_ghz <= 100.: 112 relative_permittivity = 6.31 113 conductivity = 0.0036*np.power(f_ghz, 1.3394) 114 return (relative_permittivity, conductivity) 115 elif 220. <= f_ghz <= 450.: 116 relative_permittivity = 5.79 117 conductivity = 0.0004*np.power(f_ghz, 1.658) 118 return (relative_permittivity, conductivity) 119 else: 120 return (-1.0, -1.0) 121 122 # Materials parameters will be updated when the frequency is set 123 rm = RadioMaterial("itu_glass", 124 frequency_update_callback=glass_properties, 125 dtype=dtype) 126 scene.Scene().add(rm) 127 128 ######################################### 129 # Ceiling board 130 ######################################### 131 132 def ceiling_board_properties(f_hz): 133 f_ghz = f_hz / 1e9 134 if 1. <= f_ghz <= 100.: 135 relative_permittivity = 1.48 136 conductivity = 0.0011*np.power(f_ghz, 1.0750) 137 return (relative_permittivity, conductivity) 138 elif 220. <= f_ghz <= 450.: 139 relative_permittivity = 1.52 140 conductivity = 0.0029*np.power(f_ghz, 1.029) 141 return (relative_permittivity, conductivity) 142 else: 143 return (-1.0, -1.0) 144 145 # Materials parameters will be updated when the frequency is set 146 rm = RadioMaterial("itu_ceiling_board", 147 frequency_update_callback=ceiling_board_properties, 148 dtype=dtype) 149 scene.Scene().add(rm) 150 151 ######################################### 152 # Chipboard 153 ######################################### 154 155 def chipboard_properties(f_hz): 156 f_ghz = f_hz / 1e9 157 if f_ghz < 1.0 or f_ghz > 100.0: 158 return (-1.0, -1.0) 159 160 relative_permittivity = 2.58 161 conductivity = 0.0217*np.power(f_ghz, 0.7800) 162 return (relative_permittivity, conductivity) 163 164 # Materials parameters will be updated when the frequency is set 165 rm = RadioMaterial("itu_chipboard", 166 frequency_update_callback=chipboard_properties, 167 dtype=dtype) 168 scene.Scene().add(rm) 169 170 ######################################### 171 # Plywood 172 ######################################### 173 174 def plywood_properties(f_hz): 175 f_ghz = f_hz / 1e9 176 if f_ghz < 1.0 or f_ghz > 40.0: 177 return (-1.0, -1.0) 178 179 relative_permittivity = 2.71 180 conductivity = 0.33 181 return (relative_permittivity, conductivity) 182 183 # Materials parameters will be updated when the frequency is set 184 rm = RadioMaterial("itu_plywood", 185 frequency_update_callback=plywood_properties, 186 dtype=dtype) 187 scene.Scene().add(rm) 188 189 ######################################### 190 # Marble 191 ######################################### 192 193 def marble_properties(f_hz): 194 f_ghz = f_hz / 1e9 195 if f_ghz < 1.0 or f_ghz > 60.0: 196 return (-1.0, -1.0) 197 198 relative_permittivity = 7.074 199 conductivity = 0.0055*np.power(f_ghz, 0.9262) 200 return (relative_permittivity, conductivity) 201 202 # Materials parameters will be updated when the frequency is set 203 rm = RadioMaterial("itu_marble", 204 frequency_update_callback=marble_properties, 205 dtype=dtype) 206 scene.Scene().add(rm) 207 208 ######################################### 209 # Floorboard 210 ######################################### 211 212 def floorboard_properties(f_hz): 213 f_ghz = f_hz / 1e9 214 if f_ghz < 50.0 or f_ghz > 100.0: 215 return (-1.0, -1.0) 216 217 relative_permittivity = 3.66 218 conductivity = 0.0044*np.power(f_ghz, 1.3515) 219 return (relative_permittivity, conductivity) 220 221 # Materials parameters will be updated when the frequency is set 222 rm = RadioMaterial("itu_floorboard", 223 frequency_update_callback=floorboard_properties, 224 dtype=dtype) 225 scene.Scene().add(rm) 226 227 ######################################### 228 # Metal 229 ######################################### 230 231 def metal_properties(f_hz): 232 f_ghz = f_hz / 1e9 233 if f_ghz < 1.0 or f_ghz > 100.0: 234 return (-1.0, -1.0) 235 236 relative_permittivity = 1.0 237 conductivity = 1e7 238 return (relative_permittivity, conductivity) 239 240 # Materials parameters will be updated when the frequency is set 241 rm = RadioMaterial("itu_metal", 242 frequency_update_callback=metal_properties, 243 dtype=dtype) 244 scene.Scene().add(rm) 245 246 ######################################### 247 # Very dry ground 248 ######################################### 249 250 def very_dry_ground_properties(f_hz): 251 f_ghz = f_hz / 1e9 252 if f_ghz < 1.0 or f_ghz > 10.0: 253 return (-1.0, -1.0) 254 255 relative_permittivity = 3.0 256 conductivity = 0.00015*np.power(f_ghz, 2.52) 257 return (relative_permittivity, conductivity) 258 259 # Materials parameters will be updated when the frequency is set 260 rm = RadioMaterial("itu_very_dry_ground", 261 frequency_update_callback=very_dry_ground_properties, 262 dtype=dtype) 263 scene.Scene().add(rm) 264 265 ######################################### 266 # Medium dry ground 267 ######################################### 268 269 def medium_dry_ground_properties(f_hz): 270 f_ghz = f_hz / 1e9 271 if f_ghz < 1.0 or f_ghz > 10.0: 272 return (-1.0, -1.0) 273 274 relative_permittivity = 15.0*np.power(f_ghz, -0.1) 275 conductivity = 0.035*np.power(f_ghz, 1.63) 276 return (relative_permittivity, conductivity) 277 278 # Materials parameters will be updated when the frequency is set 279 rm = RadioMaterial("itu_medium_dry_ground", 280 frequency_update_callback=medium_dry_ground_properties, 281 dtype=dtype) 282 scene.Scene().add(rm) 283 284 ######################################### 285 # Wet ground 286 ######################################### 287 288 def wet_ground_properties(f_hz): 289 f_ghz = f_hz / 1e9 290 if f_ghz < 1.0 or f_ghz > 10.0: 291 return (-1.0, -1.0) 292 293 relative_permittivity = 30.0*np.power(f_ghz, -0.4) 294 conductivity = 0.15*np.power(f_ghz, 1.30) 295 return (relative_permittivity, conductivity) 296 297 # Materials parameters will be updated when the frequency is set 298 rm = RadioMaterial("itu_wet_ground", 299 frequency_update_callback=wet_ground_properties, 300 dtype=dtype) 301 scene.Scene().add(rm)