/* * This program source code file is part of KICAD, a free EDA CAD application. * * Copyright (C) 2023 Kicad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Based on IEC60664-1 : 2020-05 #include "iec60664.h" #include double IEC60664::GetMinGrooveWidth( const POLLUTION_DEGREE aPD, const double aDistIso ) { if( aDistIso <= 0 ) return -1; // Based on IEC60664-1 : 2020-05 ยง6.8 if( abs( aDistIso ) < 3 ) return aDistIso / 3; switch( aPD ) { case POLLUTION_DEGREE::PD1: return 0.25; case POLLUTION_DEGREE::PD2: return 1.0; case POLLUTION_DEGREE::PD3: return 1.5; default: return -1; } } double IEC60664::GetClearanceAltitudeCorrectionFactor( const double aAltitude ) { // Based on IEC60664-1 : 2020-05 Table A.2 if( aAltitude <= 2000 ) return 1.0; if( aAltitude <= 3000 ) return 1.14; if( aAltitude <= 4000 ) return 1.29; if( aAltitude <= 5000 ) return 1.48; if( aAltitude <= 6000 ) return 1.70; if( aAltitude <= 7000 ) return 1.95; if( aAltitude <= 8000 ) return 2.25; if( aAltitude <= 9000 ) return 2.62; if( aAltitude <= 10000 ) return 3.02; if( aAltitude <= 15000 ) return 6.67; if( aAltitude <= 20000 ) return 14.5; return -1; } double IEC60664::GetClearanceForRMSVoltage( const double aVRMS, const FIELD aField ) { // Based on IEC60664-1 : 2020-05 Table A.1 switch( aField ) { case FIELD::INHOMOGENEOUS: if( aVRMS <= 0.028 ) return 0.001; if( aVRMS <= 0.053 ) return 0.002; if( aVRMS <= 0.078 ) return 0.003; if( aVRMS <= 0.102 ) return 0.004; if( aVRMS <= 0.124 ) return 0.005; if( aVRMS <= 0.152 ) return 0.00625; if( aVRMS <= 0.191 ) return 0.008; if( aVRMS <= 0.23 ) return 0.010; if( aVRMS <= 0.25 ) return 0.012; if( aVRMS <= 0.26 ) return 0.015; if( aVRMS <= 0.28 ) return 0.020; if( aVRMS <= 0.31 ) return 0.025; if( aVRMS <= 0.33 ) return 0.030; if( aVRMS <= 0.37 ) return 0.040; if( aVRMS <= 0.37 ) return 0.040; if( aVRMS <= 0.40 ) return 0.050; if( aVRMS <= 0.42 ) return 0.0625; if( aVRMS <= 0.46 ) return 0.080; if( aVRMS <= 0.50 ) return 0.10; if( aVRMS <= 0.52 ) return 0.12; if( aVRMS <= 0.57 ) return 0.15; if( aVRMS <= 0.62 ) return 0.20; if( aVRMS <= 0.67 ) return 0.25; if( aVRMS <= 0.71 ) return 0.30; if( aVRMS <= 0.78 ) return 0.40; if( aVRMS <= 0.84 ) return 0.50; if( aVRMS <= 0.90 ) return 0.60; if( aVRMS <= 0.98 ) return 0.80; if( aVRMS <= 1.06 ) return 1.0; if( aVRMS <= 1.20 ) return 1.2; if( aVRMS <= 1.39 ) return 1.5; if( aVRMS <= 1.68 ) return 2.0; if( aVRMS <= 1.96 ) return 2.5; if( aVRMS <= 2.21 ) return 3.0; if( aVRMS <= 2.68 ) return 4.0; if( aVRMS <= 3.11 ) return 5.0; if( aVRMS <= 3.51 ) return 6.0; if( aVRMS <= 4.26 ) return 8.0; if( aVRMS <= 4.95 ) return 10; if( aVRMS <= 5.78 ) return 12.0; if( aVRMS <= 7.0 ) return 15.0; if( aVRMS <= 8.98 ) return 20.0; if( aVRMS <= 10.8 ) return 25.0; if( aVRMS <= 12.7 ) return 30.0; if( aVRMS <= 16.2 ) return 40.0; if( aVRMS <= 19.6 ) return 50.0; if( aVRMS <= 22.8 ) return 60.0; if( aVRMS <= 29.2 ) return 80.0; if( aVRMS <= 35.4 ) return 80.0; break; case FIELD::HOMOGENEOUS: if( aVRMS <= 0.028 ) return 0.001; if( aVRMS <= 0.053 ) return 0.002; if( aVRMS <= 0.078 ) return 0.003; if( aVRMS <= 0.102 ) return 0.004; if( aVRMS <= 0.124 ) return 0.005; if( aVRMS <= 0.152 ) return 0.00625; if( aVRMS <= 0.191 ) return 0.008; if( aVRMS <= 0.23 ) return 0.010; if( aVRMS <= 0.25 ) return 0.012; if( aVRMS <= 0.26 ) return 0.015; if( aVRMS <= 0.28 ) return 0.020; if( aVRMS <= 0.31 ) return 0.025; if( aVRMS <= 0.33 ) return 0.030; if( aVRMS <= 0.37 ) return 0.040; if( aVRMS <= 0.37 ) return 0.040; if( aVRMS <= 0.40 ) return 0.050; if( aVRMS <= 0.42 ) return 0.0625; if( aVRMS <= 0.50 ) return 0.080; if( aVRMS <= 0.57 ) return 0.10; if( aVRMS <= 0.64 ) return 0.12; if( aVRMS <= 0.74 ) return 0.15; if( aVRMS <= 0.89 ) return 0.20; if( aVRMS <= 1.03 ) return 0.25; if( aVRMS <= 1.15 ) return 0.30; if( aVRMS <= 1.38 ) return 0.40; if( aVRMS <= 1.59 ) return 0.50; if( aVRMS <= 1.79 ) return 0.60; if( aVRMS <= 2.15 ) return 0.80; if( aVRMS <= 2.47 ) return 1.0; if( aVRMS <= 2.89 ) return 1.2; if( aVRMS <= 3.50 ) return 1.5; if( aVRMS <= 4.48 ) return 2.0; if( aVRMS <= 5.41 ) return 2.5; if( aVRMS <= 6.32 ) return 3.0; if( aVRMS <= 8.06 ) return 4.0; if( aVRMS <= 9.76 ) return 5.0; if( aVRMS <= 11.5 ) return 6.0; if( aVRMS <= 14.6 ) return 8.0; if( aVRMS <= 17.7 ) return 10; if( aVRMS <= 20.9 ) return 12.0; if( aVRMS <= 25.7 ) return 15.0; if( aVRMS <= 33.5 ) return 20.0; if( aVRMS <= 41.2 ) return 25.0; if( aVRMS <= 48.8 ) return 30.0; if( aVRMS <= 63.6 ) return 40.0; if( aVRMS <= 78.5 ) return 50.0; if( aVRMS <= 92.6 ) return 60.0; if( aVRMS <= 120.9 ) return 80.0; if( aVRMS <= 148.5 ) return 80.0; break; default: break; } return -1; // Out of range } double IEC60664::GetClearanceToWithstandTransientVoltage( const double aVoltage, const POLLUTION_DEGREE aPD, const FIELD aField ) { // Based on IEC60664-1 : 2020-05 Table F.2 switch( aField ) { case FIELD::INHOMOGENEOUS: if( aPD <= POLLUTION_DEGREE::PD1 ) { if( aVoltage <= 0.33 ) return 0.01; if( aVoltage <= 0.40 ) return 0.02; if( aVoltage <= 0.50 ) return 0.04; if( aVoltage <= 0.60 ) return 0.06; if( aVoltage <= 0.80 ) return 0.10; if( aVoltage <= 1.0 ) return 0.15; } if( aPD <= POLLUTION_DEGREE::PD2 ) { if( aVoltage <= 1.0 ) return 0.2; if( aVoltage <= 1.2 ) return 0.25; if( aVoltage <= 1.5 ) return 0.5; } if( aPD <= POLLUTION_DEGREE::PD3 ) { if( aVoltage <= 1.5 ) return 0.8; if( aVoltage <= 2.0 ) return 1.0; if( aVoltage <= 2.5 ) return 1.5; } if( ( aPD >= POLLUTION_DEGREE::PD4 ) && ( aVoltage <= 2.5 ) ) return 1.6; if( aVoltage <= 3.0 ) return 2.0; if( aVoltage <= 4.0 ) return 3.0; if( aVoltage <= 5.0 ) return 4.0; if( aVoltage <= 6.0 ) return 5.5; if( aVoltage <= 8.0 ) return 8.0; if( aVoltage <= 10 ) return 11; if( aVoltage <= 12 ) return 14; if( aVoltage <= 15 ) return 18; if( aVoltage <= 20 ) return 25; if( aVoltage <= 25 ) return 33; if( aVoltage <= 30 ) return 40; if( aVoltage <= 40 ) return 60; if( aVoltage <= 50 ) return 75; if( aVoltage <= 60 ) return 90; if( aVoltage <= 80 ) return 130; if( aVoltage <= 100 ) return 170; break; case FIELD::HOMOGENEOUS: if( aPD <= POLLUTION_DEGREE::PD1 ) { if( aVoltage <= 0.33 ) return 0.01; if( aVoltage <= 0.40 ) return 0.02; if( aVoltage <= 0.50 ) return 0.04; if( aVoltage <= 0.60 ) return 0.06; if( aVoltage <= 0.80 ) return 0.10; if( aVoltage <= 1.0 ) return 0.15; if( aVoltage <= 1.2 ) return 0.2; } if( aPD <= POLLUTION_DEGREE::PD2 ) { if( aVoltage <= 1.2 ) return 0.2; if( aVoltage <= 1.5 ) return 0.3; if( aVoltage <= 2.0 ) return 0.45; if( aVoltage <= 2.5 ) return 0.60; if( aVoltage <= 3.0 ) return 0.80; } if( aPD <= POLLUTION_DEGREE::PD3 ) { if( aVoltage <= 3.0 ) return 0.80; if( aVoltage <= 4.0 ) return 1.2; if( aVoltage <= 5.0 ) return 1.5; } if( ( aPD >= POLLUTION_DEGREE::PD4 ) && ( aVoltage <= 5.0 ) ) return 1.6; if( aVoltage <= 6.0 ) return 2.0; if( aVoltage <= 8.0 ) return 3.0; if( aVoltage <= 10 ) return 3.5; if( aVoltage <= 12 ) return 4.5; if( aVoltage <= 15 ) return 5.5; if( aVoltage <= 20 ) return 8.0; if( aVoltage <= 25 ) return 10; if( aVoltage <= 30 ) return 12.5; if( aVoltage <= 40 ) return 17; if( aVoltage <= 50 ) return 22; if( aVoltage <= 60 ) return 27; if( aVoltage <= 80 ) return 35; if( aVoltage <= 100 ) return 45; break; default: break; } return -1; // Out of range } double IEC60664::GetClearanceToWithstandPeaks( const double aVoltage, const FIELD aField ) { // Based on IEC60664-1 : 2020-05 Table F.8 switch( aField ) { case FIELD::INHOMOGENEOUS: if( aVoltage <= 0.04 ) return 0.001; if( aVoltage <= 0.06 ) return 0.002; if( aVoltage <= 0.1 ) return 0.003; if( aVoltage <= 0.12 ) return 0.004; if( aVoltage <= 0.15 ) return 0.005; if( aVoltage <= 0.20 ) return 0.006; if( aVoltage <= 0.25 ) return 0.008; if( aVoltage <= 0.33 ) return 0.01; if( aVoltage <= 0.4 ) return 0.02; if( aVoltage <= 0.5 ) return 0.04; if( aVoltage <= 0.6 ) return 0.06; if( aVoltage <= 0.8 ) return 0.13; if( aVoltage <= 1.0 ) return 0.26; if( aVoltage <= 1.2 ) return 0.42; if( aVoltage <= 1.5 ) return 0.76; if( aVoltage <= 2.0 ) return 1.27; if( aVoltage <= 2.5 ) return 1.8; if( aVoltage <= 3.0 ) return 2.4; if( aVoltage <= 4.0 ) return 3.8; if( aVoltage <= 5.0 ) return 5.7; if( aVoltage <= 6.0 ) return 7.9; if( aVoltage <= 8.0 ) return 11.0; if( aVoltage <= 10 ) return 15.2; if( aVoltage <= 12 ) return 19; if( aVoltage <= 15 ) return 25; if( aVoltage <= 20 ) return 34; if( aVoltage <= 25 ) return 44; if( aVoltage <= 30 ) return 55; if( aVoltage <= 40 ) return 77; if( aVoltage <= 50 ) return 100; break; case FIELD::HOMOGENEOUS: if( aVoltage <= 0.04 ) return 0.001; if( aVoltage <= 0.06 ) return 0.002; if( aVoltage <= 0.1 ) return 0.003; if( aVoltage <= 0.12 ) return 0.004; if( aVoltage <= 0.15 ) return 0.005; if( aVoltage <= 0.20 ) return 0.006; if( aVoltage <= 0.25 ) return 0.008; if( aVoltage <= 0.33 ) return 0.01; if( aVoltage <= 0.33 ) return 0.01; if( aVoltage <= 0.4 ) return 0.02; if( aVoltage <= 0.5 ) return 0.04; if( aVoltage <= 0.6 ) return 0.06; if( aVoltage <= 0.8 ) return 0.1; if( aVoltage <= 1.0 ) return 0.15; if( aVoltage <= 1.2 ) return 0.2; if( aVoltage <= 1.5 ) return 0.3; if( aVoltage <= 2.0 ) return 0.45; if( aVoltage <= 2.5 ) return 0.6; if( aVoltage <= 3.0 ) return 0.8; if( aVoltage <= 4.0 ) return 1.2; if( aVoltage <= 5.0 ) return 1.5; if( aVoltage <= 6.0 ) return 2; if( aVoltage <= 8.0 ) return 3; if( aVoltage <= 10 ) return 3.5; if( aVoltage <= 12 ) return 4.5; if( aVoltage <= 15 ) return 5.5; if( aVoltage <= 20 ) return 8; if( aVoltage <= 25 ) return 10; if( aVoltage <= 30 ) return 12.5; if( aVoltage <= 40 ) return 17; if( aVoltage <= 50 ) return 22; if( aVoltage <= 60 ) return 27; if( aVoltage <= 80 ) return 35; if( aVoltage <= 100 ) return 45; break; default: break; } return -1; } double IEC60664::GetRatedImpulseWithstandVoltage() { // Based on IEC60664-1 : 2020-05 Table F.1 double voltage = m_ratedVoltage; switch( m_overvoltageCat ) { case OV_CATEGORY::OV_I: if( voltage <= 50 ) return 330; if( voltage <= 100 ) return 500; if( voltage <= 150 ) return 800; if( voltage <= 300 ) return 1500; if( voltage <= 600 ) return 2500; if( voltage <= 1000 ) return 4000; if( voltage <= 1250 ) return 4000; if( voltage <= 1500 ) return 6000; break; case OV_CATEGORY::OV_II: if( voltage <= 50 ) return 500; if( voltage <= 100 ) return 800; if( voltage <= 150 ) return 1500; if( voltage <= 300 ) return 2500; if( voltage <= 600 ) return 4000; if( voltage <= 1000 ) return 6000; if( voltage <= 1250 ) return 6000; if( voltage <= 1500 ) return 8000; break; case OV_CATEGORY::OV_III: if( voltage <= 50 ) return 800; if( voltage <= 100 ) return 1500; if( voltage <= 150 ) return 2500; if( voltage <= 300 ) return 4000; if( voltage <= 600 ) return 6000; if( voltage <= 1000 ) return 8000; if( voltage <= 1250 ) return 8000; if( voltage <= 1500 ) return 10000; break; case OV_CATEGORY::OV_IV: if( voltage <= 50 ) return 1500; if( voltage <= 100 ) return 2500; if( voltage <= 150 ) return 4000; if( voltage <= 300 ) return 6000; if( voltage <= 600 ) return 8000; if( voltage <= 1000 ) return 12000; if( voltage <= 1250 ) return 12000; if( voltage <= 1500 ) return 15000; break; default: break; } return -1; // Out of range } IEC60664::MATERIAL_GROUP IEC60664::GetMaterialGroupFromCTI( const double aCTI ) { if( aCTI >= 600 ) return MATERIAL_GROUP::MG_I; if( aCTI >= 400 ) return MATERIAL_GROUP::MG_II; if( aCTI >= 175 ) return MATERIAL_GROUP::MG_IIIa; if( aCTI >= 100 ) return MATERIAL_GROUP::MG_IIIb; return MATERIAL_GROUP::NOT_INSULATING; } double IEC60664::GetBasicCreepageDistance( const double aVoltage, const POLLUTION_DEGREE aPD, const MATERIAL_GROUP aMG ) { // Based on IEC60664-1 : 2020-05 Table F.5 bool IsPCBmaterial = m_pcbMaterial; if( aVoltage > 1000 ) IsPCBmaterial = false; if( aPD >= POLLUTION_DEGREE::PD3 ) IsPCBmaterial = false; if( aPD >= POLLUTION_DEGREE::PD2 && aMG == MATERIAL_GROUP::MG_IIIb ) IsPCBmaterial = false; if( IsPCBmaterial ) { if( aPD == POLLUTION_DEGREE::PD1 ) { if( aVoltage <= 50 ) return 0.025; if( aVoltage <= 63 ) return 0.040; if( aVoltage <= 80 ) return 0.063; if( aVoltage <= 100 ) return 0.100; if( aVoltage <= 125 ) return 0.160; if( aVoltage <= 160 ) return 0.250; if( aVoltage <= 200 ) return 0.400; if( aVoltage <= 250 ) return 0.560; if( aVoltage <= 320 ) return 0.75; if( aVoltage <= 400 ) return 1.0; if( aVoltage <= 500 ) return 1.3; if( aVoltage <= 630 ) return 1.8; if( aVoltage <= 800 ) return 2.4; if( aVoltage <= 1000 ) return 3.2; } if( aPD == POLLUTION_DEGREE::PD2 ) { if( aVoltage <= 50 ) return 0.040; if( aVoltage <= 63 ) return 0.063; if( aVoltage <= 80 ) return 0.100; if( aVoltage <= 100 ) return 0.160; if( aVoltage <= 125 ) return 0.250; if( aVoltage <= 160 ) return 0.400; if( aVoltage <= 200 ) return 0.630; if( aVoltage <= 250 ) return 1.000; if( aVoltage <= 320 ) return 1.60; if( aVoltage <= 400 ) return 2.0; if( aVoltage <= 500 ) return 2.5; if( aVoltage <= 630 ) return 3.2; if( aVoltage <= 800 ) return 4.0; if( aVoltage <= 1000 ) return 5.0; } } if( aPD == POLLUTION_DEGREE::PD1 ) { if( aVoltage <= 10 ) return 0.080; if( aVoltage <= 12.5 ) return 0.090; if( aVoltage <= 16 ) return 0.100; if( aVoltage <= 20 ) return 0.110; if( aVoltage <= 25 ) return 0.125; if( aVoltage <= 32 ) return 0.14; if( aVoltage <= 40 ) return 0.16; if( aVoltage <= 50 ) return 0.18; if( aVoltage <= 63 ) return 0.20; if( aVoltage <= 80 ) return 0.22; if( aVoltage <= 100 ) return 0.25; if( aVoltage <= 125 ) return 0.28; if( aVoltage <= 160 ) return 0.32; if( aVoltage <= 200 ) return 0.42; if( aVoltage <= 250 ) return 0.56; if( aVoltage <= 320 ) return 0.75; if( aVoltage <= 400 ) return 1.0; if( aVoltage <= 500 ) return 1.3; if( aVoltage <= 630 ) return 1.8; if( aVoltage <= 800 ) return 2.4; if( aVoltage <= 1000 ) return 3.2; if( aVoltage <= 1250 ) return 4.2; if( aVoltage <= 1600 ) return 5.6; if( aVoltage <= 2000 ) return 7.5; if( aVoltage <= 2500 ) return 10.0; if( aVoltage <= 3200 ) return 12.5; if( aVoltage <= 4000 ) return 16.0; if( aVoltage <= 5000 ) return 20.0; if( aVoltage <= 6300 ) return 25.0; if( aVoltage <= 8000 ) return 32.0; if( aVoltage <= 10000 ) return 40.0; if( aVoltage <= 12500 ) return 50.0; if( aVoltage <= 16000 ) return 63.0; if( aVoltage <= 20000 ) return 80.0; if( aVoltage <= 25000 ) return 100.0; if( aVoltage <= 32000 ) return 125.0; if( aVoltage <= 40000 ) return 160.0; if( aVoltage <= 50000 ) return 200.0; if( aVoltage <= 63000 ) return 250; } if( aPD == POLLUTION_DEGREE::PD2 && aMG == MATERIAL_GROUP::MG_I ) { if( aVoltage <= 10 ) return 0.400; if( aVoltage <= 12.5 ) return 0.420; if( aVoltage <= 16 ) return 0.450; if( aVoltage <= 20 ) return 0.480; if( aVoltage <= 25 ) return 0.500; if( aVoltage <= 32 ) return 0.53; if( aVoltage <= 40 ) return 0.56; if( aVoltage <= 50 ) return 0.60; if( aVoltage <= 63 ) return 0.63; if( aVoltage <= 80 ) return 0.67; if( aVoltage <= 100 ) return 0.71; if( aVoltage <= 125 ) return 0.75; if( aVoltage <= 160 ) return 0.80; if( aVoltage <= 200 ) return 1.00; if( aVoltage <= 250 ) return 1.25; if( aVoltage <= 320 ) return 1.60; if( aVoltage <= 400 ) return 2.0; if( aVoltage <= 500 ) return 2.5; if( aVoltage <= 630 ) return 3.2; if( aVoltage <= 800 ) return 4.0; if( aVoltage <= 1000 ) return 5.0; if( aVoltage <= 1250 ) return 6.3; if( aVoltage <= 1600 ) return 8.0; if( aVoltage <= 2000 ) return 10.0; if( aVoltage <= 2500 ) return 12.5; if( aVoltage <= 3200 ) return 16.0; if( aVoltage <= 4000 ) return 20.0; if( aVoltage <= 5000 ) return 25.0; if( aVoltage <= 6300 ) return 32.0; if( aVoltage <= 8000 ) return 40.0; if( aVoltage <= 10000 ) return 50.0; if( aVoltage <= 12500 ) return 63.0; if( aVoltage <= 16000 ) return 80.0; if( aVoltage <= 20000 ) return 100.0; if( aVoltage <= 25000 ) return 125.0; if( aVoltage <= 32000 ) return 160.0; if( aVoltage <= 40000 ) return 200.0; if( aVoltage <= 50000 ) return 250.0; if( aVoltage <= 63000 ) return 320.0; } if( aPD == POLLUTION_DEGREE::PD2 && aMG == MATERIAL_GROUP::MG_II ) { if( aVoltage <= 10 ) return 0.400; if( aVoltage <= 12.5 ) return 0.420; if( aVoltage <= 16 ) return 0.450; if( aVoltage <= 20 ) return 0.480; if( aVoltage <= 25 ) return 0.500; if( aVoltage <= 32 ) return 0.53; if( aVoltage <= 40 ) return 0.80; if( aVoltage <= 50 ) return 0.85; if( aVoltage <= 63 ) return 0.90; if( aVoltage <= 80 ) return 0.95; if( aVoltage <= 100 ) return 1.00; if( aVoltage <= 125 ) return 1.05; if( aVoltage <= 160 ) return 1.10; if( aVoltage <= 200 ) return 1.40; if( aVoltage <= 250 ) return 1.80; if( aVoltage <= 320 ) return 2.20; if( aVoltage <= 400 ) return 2.8; if( aVoltage <= 500 ) return 3.6; if( aVoltage <= 630 ) return 4.5; if( aVoltage <= 800 ) return 5.6; if( aVoltage <= 1000 ) return 7.1; if( aVoltage <= 1250 ) return 9.0; if( aVoltage <= 1600 ) return 11.0; if( aVoltage <= 2000 ) return 14.0; if( aVoltage <= 2500 ) return 18.0; if( aVoltage <= 3200 ) return 22.0; if( aVoltage <= 4000 ) return 28.0; if( aVoltage <= 5000 ) return 36.0; if( aVoltage <= 6300 ) return 45.0; if( aVoltage <= 8000 ) return 56.0; if( aVoltage <= 10000 ) return 71.0; if( aVoltage <= 12500 ) return 90.0; if( aVoltage <= 16000 ) return 110.0; if( aVoltage <= 20000 ) return 140.0; if( aVoltage <= 25000 ) return 180.0; if( aVoltage <= 32000 ) return 220.0; if( aVoltage <= 40000 ) return 280.0; if( aVoltage <= 50000 ) return 360.0; if( aVoltage <= 63000 ) return 450.0; } if( aPD == POLLUTION_DEGREE::PD2 && ( aMG == MATERIAL_GROUP::MG_IIIa || aMG == MATERIAL_GROUP::MG_IIIb ) ) { if( aVoltage <= 10 ) return 0.400; if( aVoltage <= 12.5 ) return 0.420; if( aVoltage <= 16 ) return 0.450; if( aVoltage <= 20 ) return 0.480; if( aVoltage <= 25 ) return 0.500; if( aVoltage <= 32 ) return 0.53; if( aVoltage <= 40 ) return 1.10; if( aVoltage <= 50 ) return 1.20; if( aVoltage <= 63 ) return 1.25; if( aVoltage <= 80 ) return 1.30; if( aVoltage <= 100 ) return 1.40; if( aVoltage <= 125 ) return 1.50; if( aVoltage <= 160 ) return 1.60; if( aVoltage <= 50000 ) return aVoltage / 100; if( aVoltage <= 63000 ) return 600.0; } if( aPD == POLLUTION_DEGREE::PD3 && aMG == MATERIAL_GROUP::MG_I ) { if( aVoltage <= 10 ) return 1.000; if( aVoltage <= 12.5 ) return 1.050; if( aVoltage <= 16 ) return 1.100; if( aVoltage <= 20 ) return 1.200; if( aVoltage <= 25 ) return 1.250; if( aVoltage <= 32 ) return 1.30; if( aVoltage <= 40 ) return 1.40; if( aVoltage <= 50 ) return 1.50; if( aVoltage <= 63 ) return 1.60; if( aVoltage <= 80 ) return 1.70; if( aVoltage <= 100 ) return 1.80; if( aVoltage <= 125 ) return 1.90; if( aVoltage <= 160 ) return 2.00; if( aVoltage <= 200 ) return 2.50; if( aVoltage <= 250 ) return 3.20; if( aVoltage <= 320 ) return 4.00; if( aVoltage <= 400 ) return 5.0; if( aVoltage <= 500 ) return 6.3; if( aVoltage <= 630 ) return 8.0; if( aVoltage <= 800 ) return 10.0; if( aVoltage <= 1000 ) return 12.5; if( aVoltage <= 1250 ) return 16.0; if( aVoltage <= 1600 ) return 20.0; if( aVoltage <= 2000 ) return 25.0; if( aVoltage <= 2500 ) return 32.0; if( aVoltage <= 3200 ) return 40.0; if( aVoltage <= 4000 ) return 50.0; if( aVoltage <= 5000 ) return 63.0; if( aVoltage <= 6300 ) return 80.0; if( aVoltage <= 8000 ) return 100.0; if( aVoltage <= 10000 ) return 125.0; } if( aPD == POLLUTION_DEGREE::PD3 && aMG == MATERIAL_GROUP::MG_II ) { if( aVoltage <= 10 ) return 1.000; if( aVoltage <= 12.5 ) return 1.050; if( aVoltage <= 16 ) return 1.100; if( aVoltage <= 20 ) return 1.200; if( aVoltage <= 25 ) return 1.250; if( aVoltage <= 32 ) return 1.30; if( aVoltage <= 40 ) return 1.60; if( aVoltage <= 50 ) return 1.70; if( aVoltage <= 63 ) return 1.80; if( aVoltage <= 80 ) return 1.90; if( aVoltage <= 100 ) return 2.00; if( aVoltage <= 125 ) return 2.10; if( aVoltage <= 160 ) return 2.20; if( aVoltage <= 200 ) return 2.80; if( aVoltage <= 250 ) return 3.60; if( aVoltage <= 320 ) return 4.50; if( aVoltage <= 400 ) return 5.6; if( aVoltage <= 500 ) return 7.1; if( aVoltage <= 630 ) return 9.0; if( aVoltage <= 800 ) return 11.0; if( aVoltage <= 1000 ) return 14.0; if( aVoltage <= 1250 ) return 18.0; if( aVoltage <= 1600 ) return 22.0; if( aVoltage <= 2000 ) return 28.0; if( aVoltage <= 2500 ) return 36.0; if( aVoltage <= 3200 ) return 45.0; if( aVoltage <= 4000 ) return 56.0; if( aVoltage <= 5000 ) return 71.0; if( aVoltage <= 6300 ) return 90.0; if( aVoltage <= 8000 ) return 110.0; if( aVoltage <= 10000 ) return 140.0; } if( aPD == POLLUTION_DEGREE::PD3 && ( aMG == MATERIAL_GROUP::MG_IIIa || aMG == MATERIAL_GROUP::MG_IIIb ) ) { if( aVoltage <= 10 ) return 1.000; if( aVoltage <= 12.5 ) return 1.050; if( aVoltage <= 16 ) return 1.100; if( aVoltage <= 20 ) return 1.200; if( aVoltage <= 25 ) return 1.250; if( aVoltage <= 32 ) return 1.30; if( aVoltage <= 40 ) return 1.80; if( aVoltage <= 50 ) return 1.90; if( aVoltage <= 63 ) return 2.00; if( aVoltage <= 80 ) return 2.10; if( aVoltage <= 100 ) return 2.20; if( aVoltage <= 125 ) return 2.40; if( aVoltage <= 160 ) return 2.50; if( aVoltage <= 200 ) return 3.20; if( aVoltage <= 250 ) return 4.00; if( aVoltage <= 320 ) return 5.00; if( aVoltage <= 400 ) return 6.3; if( aVoltage <= 500 ) return 8.0; if( aVoltage <= 630 ) return 10.0; if( aVoltage <= 800 ) return 12.5; if( aVoltage <= 1000 ) return 16.0; if( aVoltage <= 1250 ) return 20.0; if( aVoltage <= 1600 ) return 25.0; if( aVoltage <= 2000 ) return 32.0; if( aVoltage <= 2500 ) return 40.0; if( aVoltage <= 3200 ) return 50.0; if( aVoltage <= 4000 ) return 63.0; if( aVoltage <= 5000 ) return 80.0; if( aVoltage <= 6300 ) return 100.0; if( aVoltage <= 8000 ) return 125.0; if( aVoltage <= 10000 ) return 160.0; } return -1; // Pointed out of the table. } double IEC60664::ComputeClearanceDistance( const POLLUTION_DEGREE aPD, const FIELD aField, const double aAltitude ) { // Based on IEC60664-1 : 2020-05 chart G.1 #if 0 // Not handled in IEC60664-1 double frequency = 50; bool coatedOrPotted = false; if( frequency > 30e3 ) return -1; // Requires 60664-3 if( coatedOrPotted ) return -1; // Requires 60664-4 #endif double clearance1 = GetClearanceToWithstandTransientVoltage( ( m_insulationType == INSULATION_TYPE::REINFORCED ) ? m_transientVoltage * 1.6 : m_transientVoltage, aPD, aField ); double clearance2 = GetClearanceToWithstandPeaks( ( m_insulationType == INSULATION_TYPE::REINFORCED ) ? m_peakVoltage * 1.6 : m_peakVoltage, aField ); if( ( clearance1 == -1 ) || ( clearance2 == -1 ) ) { clearance1 = -1; clearance2 = -1; } double clearance = ( clearance1 > clearance2 ) ? clearance1 : clearance2; clearance *= GetClearanceAltitudeCorrectionFactor( aAltitude ); return clearance; } double IEC60664::ComputeCreepageDistance( const POLLUTION_DEGREE aPD, const MATERIAL_GROUP aMG ) { // Based on IEC60664-1 : 2020-05 chart H.1 #if 0 // Not handled in IEC60664-1 double frequency = 50; bool coatedOrPotted = false; if( frequency > 30e3 ) return -1; // Requires 60664-3 if( coatedOrPotted ) return -1; // Requires 60664-4 #endif double creepage = GetBasicCreepageDistance( m_RMSvoltage, aPD, aMG ); if( m_insulationType == INSULATION_TYPE::REINFORCED ) { creepage *= 2; } return creepage; } bool IEC60664::Compute() { m_clearance = ComputeClearanceDistance( m_pollutionDegree, m_field, m_altitude ); m_creepage = ComputeCreepageDistance( m_pollutionDegree, m_materialGroup ); if( m_creepage < m_clearance || m_clearance <= 0 ) m_creepage = m_clearance; m_minGrooveWidth = GetMinGrooveWidth( m_pollutionDegree, m_clearance ); return true; }