{"id":39380,"date":"2023-12-28T14:33:32","date_gmt":"2023-12-28T13:33:32","guid":{"rendered":"https:\/\/cmm.imgw.pl\/?page_id=39380"},"modified":"2025-06-06T13:19:36","modified_gmt":"2025-06-06T11:19:36","slug":"multimodel-dyspersji","status":"publish","type":"page","link":"https:\/\/cmm.imgw.pl\/?page_id=39380","title":{"rendered":"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144"},"content":{"rendered":"\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <link href=\"https:\/\/cdn.jsdelivr.net\/npm\/tailwindcss@2.2.19\/dist\/tailwind.min.css\" rel=\"stylesheet\">\n    <!-- <script src=\"\/cmm\/wp-content\/uploads\/scripts\/scriptDyspersja.js\"><\/script> -->\n    <link rel=\"stylesheet\" href=\"\/cmm\/wp-content\/uploads\/scripts\/styleDyspersja.css\">\n    <script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/3.6.1\/jquery.min.js\"><\/script>\n\n\n\n    <style>\n.bg-purple-custom {\n    background-color: #2C3E50;\n}\n.bg-teal-custom {\n    background-color: #2CD5C4;\n    transition: background-color 0.3s ease; \n}\n.bg-teal-selected {\n    background-color: #176e66;\n    transition: background-color 0.3s ease; \n}\n\n.bg-teal-deactivated {\n    background-color: #808080;\n    transition: background-color 0.3s ease; \n}\n\n.bg-teal-custom:hover {\n    background-color: #1FAA9E; \n}\n\n.bg-teal-custom:active {\n    background-color: #157E73;\n}\n.slider {\n  width: 100%; \n}\n.text-2xl-custom {\n        font-size: 16px; \n        font-weight: bold;\n    }\n\n    .canvas-container {    \n      display: flex;\n}    \n\n\n    <\/style>\n<\/head>\n<body class=\"bg-gray-100 p-5\">\n  <div class=\"bg-gray-200 py-2 px-4 rounded-sm shadow-sm text-center text-2xl-custom\">MULTIMODEL DYSPERSJI ZANIECZYSZCZE\u0143<\/div><br>\n  <div class=\"flex flex-wrap mb-4 rounded-lg shadow-lg\">\n    <div class=\"w-full sm:w-full md:w-full lg:w-1\/5 px-2 mb-4\">\n\n        <div id=\"selectors\" class=\"flex flex-wrap mb-4\">\n            <div id=\"buttons-container\" class=\"mb-4\">\n                <label>Produkt:<br><\/label>\n              <\/div>\n              <div id=\"switch-place-buttons\" class=\"mb-4\">\n                <label>Miejsce:<br><\/label>\n              <\/div>\n              <div id=\"timerun-buttons\" class=\"mb-4\">\n                <label>Termin produktu:<br><\/label>\n              <\/div>\n        <\/div>\n        \n    <\/div>\n\n    <div class=\"w-full sm:w-full md:w-full lg:w-4\/5 px-2 mb-4\">\n        <div id=\"navigationBtnGeneral\" style=\"height: 4vw;\">\n            <div id=\"navigationBtn\" class=\"grid grid-cols-6 gap-1 items-center mb-4\">\n              <button id=\"playBtn\" class=\"col-span-2 md:col-span-1 w-full sm:w-full md:w-full lg:w-auto px-18 py-4 bg-teal-custom text-white rounded-md hover:bg-teal-custom hover:text-white focus:outline-none focus:bg-teal-custom focus:text-white mx-1\">Start animacji<\/button>\n              <label for=\"speedInputMin\" class=\" hidden md:flex items-center col-span-1 justify-end\">Szybko<\/label>\n              <input type=\"range\" id=\"speedInput\" class=\"slider hidden md:block\" min=\"100\" max=\"2000\" step=\"100\" value=\"1000\">\n              <label for=\"speedInputMax\" class=\"ml-2 items-center col-span-0 hidden md:block\">Wolno<\/label>\n              <button id=\"reverseBtn\" class=\"col-span-2 md:col-span-1 px-2 py-4 bg-teal-custom text-white rounded-md hover:bg-teal-custom hover:text-white focus:outline-none focus:bg-teal-custom focus:text-white mx-1\">Poprzedni (-)<\/button>\n              <button id=\"forwardBtn\" class=\"col-span-2 md:col-span-1 px-2 py-4 bg-teal-custom text-white rounded-md hover:bg-teal-custom hover:text-white focus:outline-none focus:bg-teal-custom focus:text-white mx-1\">Nast\u0119pny (+)<\/button>\n              <br>\n              <br>\n                <!--\n                  <button id=\"buttonGIF\" class=\"px-4 py-2 bg-green-500 text-white rounded-md hover:bg-green-600 focus:outline-none focus:bg-green-600 mx-1\">Pobierz GIF<\/button>\n                -->\n                <\/div>   \n                <\/div>     \n            <div id=\"image-container\" class=\"mt-4 p-4\">\n                <p id=\"imageName\"><\/p>\n              <\/div>      \n        <div class=\"col-span-6\">\n            <img id=\"viewProduction\" src=\"\" alt=\"Oczekiwanie na dane.\" \/>\n\n        <\/div>\n        \n        <div id=\"HotCommentTxt\" class=\"border border-solid border-gray-300 flex flex-wrap mb-1 rounded-lg shadow-md\" style=\"margin: 10px; padding: 10px;\"><\/div>\n        <div class=\"border border-solid border-gray-300 flex flex-wrap mb-1 rounded-lg shadow-md\" style=\"margin-left: 0px; margin-right: 0px; margin-top: 10px; padding: 20px;\">\n        <div id=\"description\">\n        <!-- <p><strong>TRAJEKTORIE WSTECZNE<\/strong><\/p>\n<p>Trajektorie wsteczne obliczane s\u0105 na podstawie prognoz z siedmiu poprzednich dni. Okre\u015blaj\u0105, sk\u0105d docieraj\u0105 masy powietrza do danego punktu (receptora) na przyk\u0142ad w Polsce dla trzech podstawowych wysoko\u015bci &ndash; poziom&oacute;w ci\u015bnieniowych &ndash; 950, 850 i 700 hPa. Pierwszy typ rysunk&oacute;w pokazuje, jak do danego receptora dociera\u0142a trajektoria z zaznaczeniem jej po\u0142o\u017cenia w przestrzeni w ci\u0105gu ostatnich siedmiu dni. Z kolei rysunki drugiego typu prezentuj\u0105 ruch danej cz\u0105stki powietrza w p\u0142aszczy\u017anie pionowej w ca\u0142ym okresie &ldquo;podr&oacute;\u017cy&rdquo; od \u017ar&oacute;d\u0142a, czyli punktu pocz\u0105tkowego trajektorii do receptora.<\/p>\n        <\/div> -->\n        <div id=\"mainDescription\">\n          <p style=\"text-align: justify;\"><strong><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">Opis systemu informacji o skutkach uwolnienia do atmosfery substancji niebezpiecznych &ndash; RIOT&nbsp;<\/span><\/strong><\/p>\n          <span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">Opracowanie: dr Andrzej Mazur, IMGW-PIB LMM.<\/span><p style=\"text-align: justify;\">&nbsp;<\/p>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">System RIOT &ndash; &bdquo;Pier\u015bcie\u0144 zagro\u017ce\u0144&rdquo; (ang. <em>RIng Of Threats<\/em>) w za\u0142o\u017ceniu ma by\u0107 wsparciem przy okre\u015bleniu reakcji na wyst\u0105pienie potencjalnego niebezpiecze\u0144stwa dla Polski, zwi\u0105zanego z zagro\u017ceniami o pod\u0142o\u017cu antropogenicznym, b\u0119d\u0105cego przede wszystkim skutkiem wyst\u0105pienia incydent&oacute;w w elektrowniach j\u0105drowych w krajach s\u0105siednich jak r&oacute;wnie\u017c innych katastrof czy awarii o charakterze incydent&oacute;w emisyjnych substancji toksycznych. W praktyce system mo\u017ce by\u0107 wykorzystywany do symulacji i prognoz rozprzestrzeniania si\u0119 dowolnego typu zanieczyszcze\u0144 (ska\u017ce\u0144), takich jak np. produkty erupcji wulkan&oacute;w, dla oszacowania ich wp\u0142ywu na szeroko poj\u0119te bezpiecze\u0144stwo transportu, przede wszystkim transportu lotniczego.&nbsp;&nbsp;<\/span><\/p>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">G\u0142&oacute;wnym zadaniem systemu jest podniesienie poziomu bezpiecze\u0144stwa Polski w kontek\u015bcie instalacji nuklearnych znajduj\u0105cych si\u0119 w krajach s\u0105siednich. Dodatkowo, wyniki pracy systemu powinny wp\u0142ywa\u0107 na zwi\u0119kszenie bezpiecze\u0144stwa i\u202fp\u0142ynno\u015bci ruchu lotniczego nad Polsk\u0105 w przypadku wybuch&oacute;w wulkan&oacute;w, kt&oacute;re mog\u0105 spowodowa\u0107 wprowadzenie okresowego zakazu lot&oacute;w nad cz\u0119\u015bci\u0105 lub nad ca\u0142ym obszarem Polski. Celem systemu jest r&oacute;wnie\u017c dostarczenie do potencjalnego odbiorcy (agendy rz\u0105dowe, media etc.) informacji o stanie powietrza w przypadku uwolnienia do atmosfery ska\u017ce\u0144 promieniotw&oacute;rczych lub innych zanieczyszcze\u0144. W og&oacute;lnym przypadku system mo\u017ce by\u0107 wykorzystany do przygotowania prognozy skutk&oacute;w wielu incydent&oacute;w i awarii <em>in statu nascendi<\/em>, takich, jak intensywne po\u017cary lasu czy wypadki komunikacyjne po\u0142\u0105czone z emisj\u0105 substancji toksycznych.&nbsp;<\/span><\/p><p style=\"text-align: justify;\">&nbsp;<\/p>\n          <p style=\"text-align: left;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">System dzia\u0142a wg poni\u017cszego schematu:&nbsp;<\/span><\/p>\n          <ul style=\"text-align: justify; list-style-type: disc;\">\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">pobranie informacji o incydencie (wsp&oacute;\u0142rz\u0119dne geograficzne, w miar\u0119 mo\u017cliwo\u015bci wielko\u015b\u0107 uwolnienia),&nbsp;<\/span><\/li>\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"1\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">pobranie wej\u015bciowych danych meteorologicznych, przygotowywanych na bie\u017c\u0105cy dzie\u0144\/godzin\u0119 (w horyzoncie czasowym do 120 godzin do przodu),&nbsp;<\/span><\/li>\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"2\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">wst\u0119pne przetworzenie ich do postaci i formatu wymaganego przez modu\u0142 obliczeniowy,&nbsp;<\/span><\/li>\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"3\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">wykonanie symulacji dyspersji ska\u017cenia &ndash; substancji promieniotw&oacute;rczej czy toksycznej w opisie polowym (eulerowskim) i trajektorii (lagran\u017cowskim),&nbsp;<\/span><\/li>\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"4\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">przetworzenie wynik&oacute;w do wcze\u015bniej uzgodnionej postaci graficznej,&nbsp;<\/span><\/li>\n          <li data-leveltext=\"&bull;\" data-font=\"Arial\" data-listid=\"1\" data-list-defn-props=\"{&quot;335552541&quot;:1,&quot;335559684&quot;:-2,&quot;335559685&quot;:720,&quot;335559991&quot;:360,&quot;469769226&quot;:&quot;Times New Roman&quot;,&quot;469769242&quot;:[8226],&quot;469777803&quot;:&quot;left&quot;,&quot;469777804&quot;:&quot;&bull;&quot;,&quot;469777815&quot;:&quot;hybridMultilevel&quot;}\" aria-setsize=\"-1\" data-aria-posinset=\"5\" data-aria-level=\"1\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">wys\u0142anie wynik&oacute;w na serwery wybranych u\u017cytkownik&oacute;w.&nbsp;<\/span><\/li><p style=\"text-align: justify;\">&nbsp;<\/p>\n          <\/ul>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">Podstawowe pola &ndash; wyniki oblicze\u0144 &ndash; uzyskiwane jako rezultat pracy systemu, to st\u0119\u017cenie \u015brednie (u\u015brednione po ca\u0142ym okresie oblicze\u0144 i po profilu pionowym, ozn. <em>acnc<\/em>) oraz st\u0119\u017cenia chwilowe przy powierzchni (ozn. <em>ccnc<\/em>) i st\u0119\u017cenie chwilowe, u\u015brednione po profilu pionowym (ozn. <em>scnc<\/em>). Opr&oacute;cz tego uzyskiwane s\u0105 trajektorie cz\u0105stek ska\u017ce\u0144, czyli linie, po kt&oacute;rych porusza\u0142yby si\u0119 ska\u017cenia, emitowane na zadanej wysoko\u015bci nad \u017ar&oacute;d\u0142em (ozn. <em>traject<\/em>).&nbsp;<\/span><\/p><p style=\"text-align: justify;\">&nbsp;<\/p>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">Obecnie mo\u017cliwe s\u0105 trzy podstawowe obszary obliczeniowe (domeny) o r&oacute;\u017cnej powierzchni, w kt&oacute;rych wykonywane s\u0105 obliczenia w r&oacute;\u017cnej rozdzielczo\u015bci przestrzennej. Najwi\u0119ksza domena &ndash; atlantycka &ndash; obejmuje ca\u0142\u0105 Europ\u0119 od Uralu po Grenlandi\u0119 i p&oacute;\u0142nocn\u0105 Kanad\u0119, p&oacute;\u0142nocny i \u015brodkowy Atlantyk, oraz p&oacute;\u0142nocn\u0105 cz\u0119\u015b\u0107 Afryki i p&oacute;\u0142wyspu Arabskiego (rys.1a) w rozdzielczo\u015bci 25km. Po\u015brednia, europejska, to Europa Centralna i Zachodnia po Wyspy Brytyjskie i cz\u0119\u015b\u0107 p&oacute;\u0142wyspu Iberyjskiego, od po\u0142udniowej cz\u0119\u015bci Skandynawii po p&oacute;\u0142nocn\u0105 cz\u0119\u015b\u0107 p&oacute;\u0142wysp&oacute;w Apeni\u0144skiego i Ba\u0142ka\u0144skiego (Rys. 1b), w rozdzielczo\u015bci 14km. Wreszcie najmniejsza domena obejmuje Polsk\u0119 i cz\u0119\u015bciowe obszary pa\u0144stw s\u0105siaduj\u0105cych (Rys. 1c), , w rozdzielczo\u015bci 2,8km. Horyzont czasowy dla tych domen to odpowiednio 120, 78 i 48 godzin.&nbsp;<\/span><\/p>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\" data-ccp-props=\"{&quot;134245417&quot;:false,&quot;201341983&quot;:0,&quot;335551550&quot;:6,&quot;335551620&quot;:6,&quot;335559739&quot;:0,&quot;335559740&quot;:360}\"> <img loading=\"lazy\" class=\"aligncenter size-full wp-image-35644\" src=\"\/wp-content\/uploads\/2023\/08\/RIOT.png\" alt=\"\" width=\"1460\" height=\"452\" srcset=\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/08\/RIOT.png 1460w, https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/08\/RIOT-300x93.png 300w, https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/08\/RIOT-1024x317.png 1024w, https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/08\/RIOT-768x238.png 768w\" sizes=\"(max-width: 1460px) 100vw, 1460px\" \/><\/span><\/p>\n          <p style=\"text-align: left;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">Rys.1 Domeny obliczeniowe systemu RIOT. (a) atlantycka (b) europejska i (c) polska.&nbsp;<\/span><\/p><br>\n          <p style=\"text-align: justify;\"><span style=\"font-family: Arial, Helvetica, sans-serif; font-size: 12pt;\">System przygotowany zosta\u0142 na podst. za\u0142o\u017ce\u0144 opisanych w pracy &bdquo;Ocena zagro\u017cenia Polski przez ska\u017cenia promieniotw&oacute;rcze w \u015bwietle mo\u017cliwo\u015bci oddzia\u0142ywania istniej\u0105cych i planowanych elektrowni j\u0105drowych&rdquo;, autor: A. Mazur, wyd. Szko\u0142y G\u0142&oacute;wnej Gospodarstwa Wiejskiego (Warszawa), ISBN 9788375839746, https:\/\/books.google.pl\/books?id=0rJSzgEACAAJ, 2020.&nbsp;<\/span><\/p>\n          <\/div>       \n<\/div>\n      <\/div>\n  <\/div>\n    \n\n    <script>\n    const SOURCE = [\"ETA\", \"IMPRO\", \"scnc\", \"traj\"];\n    const sourceMapping = {\n      \"scnc\": \"Chwilowe st\u0119\u017cenie \u015brednie\", \n      \"traj\": \"Trajektorie\", \n      \"ETA\": \"Czas dotarcia\", \n      \"IMPRO\": \"Prawdopdoobie\u0144stwo dotarcia\"\n    }\n    const PLACES = [\"01\", \"02\", \"03\", \"04\"];\n    const placesMapping = {\n          \"01\": \"Chmielnickij\",\n          \"02\": \"Etna\",\n          \"03\": \"Reykianes-VS\",\n          \"04\": \"Salamina-Andros\"\n          };\n    var images = new Array(PLACES.length);\n    const imgPathDir = `\/cmm\/wp-content\/uploads\/production\/pp_dyspersja\/webps\/`;\n    const gifPathDir = `\/cmm\/wp-content\/uploads\/production\/pp_dyspersja`;\n\n    let selectedProduct = \"scnc\";\n    let selectedPlace = \"01\";\n    let selectedRunningIndex = 0;\n\nlet TIMERUN_BUTTONS_COUNT = 100; \ngetTimeForgenerateTimerunButtons();\nlet currentDate = new Date(); \ncurrentDate.setUTCHours(0, 0, 0, 0);\nlet startDate = new Date(currentDate.getTime()); \/\/ start from previous day: - (24 * 60 * 60 * 1000)\nlet currentIndex = 0;\nlet place ='';\nconst fileNames = []; \/\/ Array to store generated filenames\nlet buttonsContainer = document.getElementById('buttons-container');\nlet placeContainer = document.getElementById('switch-place-buttons');\nlet timerunContainer = document.getElementById('timerun-buttons');\nlet runningContainer = document.getElementById('running-buttons');\nlet imageContainer = document.getElementById('image-container');\nlet containerForecastHour = document.getElementById('containerForecastHour');\nlet currentPlaceSetIndex = 0;\nlet currentSourceSetIndex = 0;\nlet globalTIMERUN_BUTTONS_COUNT;\n\nconst currDate = new Date();\n    let startHour = currDate.getUTCHours();\n    if (startHour >= 0 && startHour < 6) {\n        startHour = 18;\n        currentIndex = 18;\n    } else if (startHour >= 6 && startHour < 12) {\n        startHour = 0;\n        currentIndex = 0;\n    } else if (startHour >= 12 && startHour < 18) {\n        startHour = 6;\n        currentIndex = 6;\n    } else if (startHour >= 18 && startHour < 24) {\n        startHour = 12;\n        currentIndex = 12;\n    } else {\n        startHour = 0;\n        currentIndex = 0;\n    }\n\n    console.log(\"=====================> startHour: \" + startHour);\n\nconst forwardButton = document.getElementById('forwardBtn');\nconst previousButton = document.getElementById('reverseBtn');\nconst playButton = document.getElementById('playBtn');\n\nfunction updateImage() {\n  const imageName = `${getProductionDate()}_${selectedProduct}_${selectedPlace}.webp`;\n  const imageNameETA = `${getProductionDate()}_${selectedProduct}_${selectedPlace}.webp`;\n  const imageUrl = `${imgPathDir}\/${imageName}`;\n  const imageUrlETA = `${imgPathDir}\/${imageNameETA}`;\n  if (selectedProduct === \"ETA\"){\n    document.getElementById(\"viewProduction\").src = imageUrlETA;\n    console.log(\"update image with ETA inside\");\n  } else {\n  document.getElementById(\"viewProduction\").src = imageUrl;\n  }\n  console.info(\"updateImage: \" + imageName);\n}\n\n    \n    function getProductionDate() {\n        \/\/ example file: 2023120512_IMPRO_01.gif\n        const date = new Date();\n        const UTCyear = date.getUTCFullYear();\n        const UTCmonth = date.getUTCMonth() + 1;\n        let UTCday = date.getUTCDate();\n        const UTChour = date.getUTCHours();\n        const UTCminutes = date.getUTCMinutes();\n\n        if (UTCday < 10 ){\n          UTCday = \"0\" + UTCday;\n        }\n\n        if (selectedProduct === \"ETA\"){\n          console.log(\"getProductionDate ETA inside\" + UTCday);\n          return `${UTCyear}-${UTCmonth.toString().padStart(2, '0')}-${UTCday}`;\n        } else {\n        return `${UTCyear}${UTCmonth.toString().padStart(2, '0')}${UTCday}00`;\n        }\n    }\n\n    document.querySelectorAll('input[name=\"product\"]').forEach((radio) => {\n        radio.addEventListener('change', (event) => {\n            selectedProduct = event.target.value;\n            displayImage();\n        });\n    });\n    \n\n    updateImage();\n\nfunction displayImage(fileName) {\n\n  const imageUrl = `${imgPathDir}\/${fileName}`;\n  document.getElementById(\"viewProduction\").src = imageUrl;\n\n}\n\nlet firstButtonId;\n\nSOURCE.forEach((source, index) => {\n  const button = document.createElement('button');\n  const buttonId = `button_${source}_${index}`; \/\/ Generate unique button ID\n  button.textContent = sourceMapping[source];\n  button.id = buttonId; \/\/ Set the ID of the button\n\n\n    button.classList.add('px-4', 'py-2', 'bg-teal-custom', 'text-white', 'rounded-md', 'hover:bg-teal-custom', 'focus:outline-none', 'focus:bg-teal-custom', 'mx-1', 'my-1');\n    button.style.backgroundColor = selectedProduct === source ? '#2CD5C4' : '#6B7280';\n    button.style.textAlign = 'left';\n\n\n  button.addEventListener('click', () => {\n    selectedProduct = source;\n    console.log(\"Selected Product:\", selectedProduct);\n    if (selectedProduct === \"IMPRO\" || selectedProduct === \"ETA\"){\n      console.log(\"Entering IMPRO\/ETA condition\");\n      generateTimerunButtons();\n      updateImage(); \n    } else {\n    console.log(\"Entering else condition\");\n    generateTimerunButtons();\n    clickFirst000Button();\n    updateImage(); \n    }\n\n    buttonsContainer.querySelectorAll('button').forEach(btn => {\n      btn.style.backgroundColor = '#2CD5C4';\n    });\n\n    \/\/ Set background color for the selected button\n    button.style.backgroundColor = '#176e66';\n  });\n  console.log(button);\n\n  buttonsContainer.appendChild(button);\n\n  \/\/ Store the ID of the first button\n  if (index === 2) {\n    firstButtonId = buttonId;\n    console.log(firstButtonId);\n  }\n});\n\n\/\/ Click the first button outside of the loop\nif (firstButtonId) {\n  const firstButton = document.getElementById(firstButtonId);\n  if (firstButton) {\n    firstButton.click();\n  }\n}\n\nPLACES.forEach((place) => {\n  const button = document.createElement('button');\n  button.textContent = placesMapping[place];\n  button.classList.add('px-4', 'py-2', 'bg-teal-custom', 'text-white', 'rounded-md', 'hover:bg-teal-custom', 'focus:outline-none', 'focus:bg-teal-custom', 'mx-1', 'my-1');\n  button.style.backgroundColor = selectedPlace === place ? '#176e66' : '#2CD5C4';\n\n  button.addEventListener('click', () => {\n    selectedPlace = place;\n    clickFirst000Button();\n    updateImage(); \n        \/\/ Remove previous background color\n        placeContainer.querySelectorAll('button').forEach(btn => {\n      btn.style.backgroundColor = '#2CD5C4';\n    });\n\n    \/\/ Set background color for the selected button\n    button.style.backgroundColor = '#176e66';\n  });\n  placeContainer.appendChild(button);\n});\n\n\/\/ Function to update the button style based on the currentIndex\nfunction updateButtonStyle() {\n  const buttons = document.querySelectorAll('#timerun-buttons button');\n  const previousSelectedButton = document.querySelector('#timerun-buttons button.selected');\n  const newSelectedButton = buttons[currentIndex];\n\n  console.error(\"newSelectedButton\" + newSelectedButton);\n  console.error(\"currentIndex\" + currentIndex);\n\n\n  if (previousSelectedButton) {\n    previousSelectedButton.classList.remove('selected');\n    previousSelectedButton.style.backgroundColor = '#2CD5C4';\n  }\n\n  if (currentIndex >= 6 ){\n  if (newSelectedButton) {\n    newSelectedButton.classList.add('selected');\n    newSelectedButton.style.backgroundColor = '#176e66';\n  }\n  }\n}\n\n\n\n\nfunction getTimeForgenerateTimerunButtons() {\n  $.ajax({\n    url: \"\/wp-content\/uploads\/scripts\/getLastDyspersjaMultimodelFile.php\",\n    dataType: \"json\",\n        success: function(data) {\n      if (data && data.filename) {\n        const receivedFilename = data.filename;\n        const datePrefix = receivedFilename.slice(0, 10); \/\/ Extract the first 10 characters representing the date\n\n        console.log(\"dataprefix: \" + datePrefix);\n        \/\/ Parse the received date from the filename\n        const year = parseInt(datePrefix.slice(0, 4), 10);\n        const month = parseInt(datePrefix.slice(4, 6), 10);\n        const day = parseInt(datePrefix.slice(6, 8), 10);\n        const hour = parseInt(datePrefix.slice(8, 10), 10);\n\n        \/\/ Create Date objects for the current date and received date\n        const currentDate = new Date();\n        const receivedDate = new Date(Date.UTC(year, month - 1, day, hour));\n        const timeDiff = receivedDate.getTime() - currentDate.getTime();\n        const diffInHours = Math.floor(timeDiff \/ (1000 * 60 * 60));\n        const currHour = currentDate.getUTCHours();\n\n        const TIMERUN_BUTTONS_COUNT = diffInHours >= 0 ? diffInHours : 0; \/\/ Use difference as the count\n      \n        console.log(\"TIMERUN_BUTTONS_COUNT2: \" + TIMERUN_BUTTONS_COUNT);\n        globalTIMERUN_BUTTONS_COUNT = TIMERUN_BUTTONS_COUNT;\n\n      } else {\n        console.error('No file data received.');\n      }\n    },\n    error: function(xhr, status, error) {\n      console.error(\"Error fetching images:\", error);\n      \/\/TIMERUN_BUTTONS_COUNT = 150;\n      generateButtonOffile();\n    }\n  });\n\n        $.ajax({\n            url: \"cmm\/wp-content\/uploads\/production\/pp_dyspersja\/comment\/HotCommentTxt.txt\",\n            dataType: \"text\",\n            success: function(data) {\n                if (data.trim() !== '') {\n                \/\/console.log(\"Received data for HotCommentTxt:\", data);\n                let trimmedData = data.trim();\n                let htmlContent = trimmedData;\n                $(\"#HotCommentTxt\").html(htmlContent).css(\"white-space\", \"pre-line\");;\n                } else {\n                    $(\"#HotCommentTxt\").hide(); \n                }\n            },\n            error: function(xhr, status, error) {\n                $(\"#HotCommentTxt\").hide(); \n                console.error(\"Error fetching HotCommentTxt.txt:\", error);\n            }\n        });\n}\n\n\nfunction generateTimerunButtons() {\n  \/\/const currentDate = new Date();\n  const currHour = currentDate.getUTCHours();\n  const currentSourceSet = SOURCE[currentSourceSetIndex];\n\/\/ Calculate the step based on the selected product\n let step;\n\/\/ let startHour = currentDate.getUTCHours();\nswitch (selectedProduct) {\n  case \"ETA\":\n    startDate = new Date(currentDate.getTime()- (24 * 60 * 60 * 1000)); \/\/ start from previous day: \n    step = TIMERUN_BUTTONS_COUNT;\n    console.log(\"timerunContainer 1:\" + timerunContainer);\n    timerunContainer.style.display = 'none';\n    break;\n  case \"IMPRO\":\n    startDate = new Date(currentDate.getTime()- (24 * 60 * 60 * 1000)); \/\/ start from previous day: \n    step = 6;\n    \/\/if (currHour > 13){\n    \/\/  TIMERUN_BUTTONS_COUNT = 30; \n    \/\/} else {\n      TIMERUN_BUTTONS_COUNT = 24; \n      timerunContainer.style.display = 'none';\n    \/\/}\n    break;\n  default:\n  startDate = new Date(currentDate.getTime()); \/\/ start from previous day: - (24 * 60 * 60 * 1000)\n  TIMERUN_BUTTONS_COUNT = globalTIMERUN_BUTTONS_COUNT;\n    step = 1;\n}\n\nconsole.log(\"TIMERUN_BUTTONS_COUNT2: \" + TIMERUN_BUTTONS_COUNT);\nconsole.log(\"globalTIMERUN_BUTTONS_COUNT2: \" + globalTIMERUN_BUTTONS_COUNT);\n\n\n\n\nif (TIMERUN_BUTTONS_COUNT !== null) {\n  timerunContainer.innerHTML = '';\nfor (let j = 0; j < TIMERUN_BUTTONS_COUNT; j += step) {\n              const currentDate = new Date();\n              const currHour = currentDate.getUTCHours();\n\n              timerunContainer.style.display = 'block';\n              console.log(\"timerunContainer 2:\" + timerunContainer);\n              const button = document.createElement('button');\n\n              const hour = j % 24;\n              const dayIncrement = Math.floor(j \/ 24);\n              let buttonDate = new Date(startDate.getTime() + (dayIncrement * 24 * 60 * 60 * 1000));\n              buttonDate.setUTCHours(hour);\n\n              const year = buttonDate.getUTCFullYear();\n              const month = (buttonDate.getUTCMonth() + 1).toString().padStart(2, '0');\n              const day = buttonDate.getUTCDate().toString().padStart(2, '0');\n              const formattedHour = j.toString().padStart(3, '0'); \/\/ number of numbers on buttons\n\n              const previousDay = new Date(buttonDate.getTime() - (24 * 60 * 60 * 1000)); \/\/ Get previous day\n              const prevDayYear = previousDay.getUTCFullYear();\n              const prevDayMonth = (previousDay.getUTCMonth() + 1).toString().padStart(2, '0');\n              const prevDay = previousDay.getUTCDate().toString().padStart(2, '0');\n\n              const fileName = `${year}${month}${day}${hour.toString().padStart(2, '0')}_${place}.webp`;\n              fileNames.push(fileName);\n\n              button.textContent = formattedHour;\n              button.classList.add('px-1', 'py-1', 'bg-teal-custom', 'text-sm', 'text-white', 'rounded-md', 'hover:bg-blue-400', 'focus:outline-none', 'focus:bg-teal-custom', 'mx-0.5', 'my-0.5');\n\n              \n              const buttonId = `${j}`;\n              button.setAttribute('id', buttonId);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n                if ( j <= startHour - 1) {\n                button.disabled = true;\n                button.style.backgroundColor = '#808080'; \n                button.style.cursor = 'default'; \n                } \n                if (j % 24 === 0) {\n                const br = document.createElement('br');\n                const br2 = document.createElement('br');\n                const title = document.createElement('span');\n                const dateString = `${year}-${month}-${day}:`;\n                title.textContent = dateString;\n                title.style.fontWeight = 'light';\n                timerunContainer.appendChild(br);\n                timerunContainer.appendChild(title);\n                timerunContainer.appendChild(br2);\n              }\n\n              timerunContainer.appendChild(button);\n              \n              if (selectedProduct === \"IMPRO\") {\n                if (j === 0 || j === 6 || j === 12) {\n                    button.style.display = 'none';\n                }\n                if (j === 18) {\n                    button.style.display = 'block';\n                }\n            }\n\n            if (selectedProduct === \"ETA\") {\n                if (j === 0 || j === 6 || j === 12 | j === 18) {\n                    button.style.display = 'none';\n                    timerunContainer.style.display = 'none';\n                    timerunContainer.classList.add('hidden');\n                }\n            }\n              \n              button.addEventListener('click', (e) => {\n            const selectedButton = e.target;\n            const file = selectedButton.dataset.fileName;\n            const buttons = Array.from(timerunContainer.querySelectorAll('button'));\n            currentIndex = buttons.indexOf(selectedButton);\n\n            \/\/ Remove previous background color\n            \/\/ timerunContainer.querySelectorAll('button').forEach(btn => {\n                \/\/btn.style.backgroundColor = '#2CD5C4'; \/\/ Reset color for all buttons\n            \/\/ });\n                \n                if (selectedProduct === \"IMPRO\" || selectedProduct === \"ETA\"){\n                    navigationBtn.classList.add('hidden');\n                } else {\n                    navigationBtn.classList.remove('hidden');\n                }\n\n\n                if (selectedProduct === \"ETA\"){\n                    timerunContainer.style.display = 'none';\n                  \/\/const file = `${prevDayYear}-${prevDayMonth}-${prevDay}_${selectedProduct}_${selectedPlace}.webp`;\n                  const file = `${year}-${month}-${day}_${selectedProduct}_${selectedPlace}.webp`;\n                  console.info(\"ETA file: \" + file);\n                  displayImage(file);\n                  updateButtonStyle(selectedButton);\n                } else if (selectedProduct === \"IMPRO\"){\n                  timerunContainer.style.display = 'none';\n                  const file = `${year}${month}${day}${hour.toString().padStart(2, '0')}_${selectedProduct}_${selectedPlace}.webp`;\n                  displayImage(file);\n                  updateButtonStyle(selectedButton);\n                } else {\n                  const file = `${year}${month}${day}${hour.toString().padStart(2, '0')}_${selectedProduct}_${selectedPlace}.webp`;\n                  displayImage(file);\n                  updateButtonStyle(selectedButton);\n                }\n\n                if (startHour >= 1 && currentIndex < 6) {\n                  console.info(\"CURRENT INDEX MAIN: \" + currentIndex);\n                  selectedButton.style.backgroundColor = '#808080'; \/\/ Gray color for buttons 000-005\n                } else {\n                  selectedButton.style.backgroundColor = '#176e66'; \/\/ Green color for buttons other than 000-005, \n                }\n              });\n            }\n          \n            console.log(\"timerunContainer 3:\" + timerunContainer);\n\n            const specificButton = document.getElementById('button_0');\n            if (specificButton) {\n              specificButton.click(); \/\/ Trigger click event on the button\n              updateButtonStyle();\n            } \n          }\n          \n          if (selectedProduct === \"IMPRO\") {\n            const specificButton = document.getElementById('18');\n  updateButtonStyle();\n            if (specificButton) {\n              specificButton.click(); \n            } \n          } else {\nclickFirst000Button();\n            }\n        };\n\ngenerateTimerunButtons();\n\nfunction clickFirst000Button (){\n  let firstToClick = startHour;\n  const specificButton = document.getElementById(firstToClick);\n  updateButtonStyle();\n            if (specificButton) {\n              specificButton.click(); \/\/ Trigger click event on the button\n            } \n}\n\nplaceContainer.addEventListener('click', () => {\n    if (selectedProduct === \"IMPRO\") {\n            const specificButton = document.getElementById('18');\n            console.log(\"click button IMPRO: \" + specificButton);\n  updateButtonStyle();\n            if (specificButton) {\n              specificButton.click(); \n            } \n          } else {\nclickFirst000Button();\n            }\n});\n\nbuttonsContainer.addEventListener('click', () => {\n    if (selectedProduct === \"IMPRO\") {\n            const specificButton = document.getElementById('18');\n            console.log(\"click button IMPRO: \" + specificButton);\n  updateButtonStyle();\n            if (specificButton) {\n              specificButton.click(); \n            } \n          } else {\nclickFirst000Button();\n            }\n});\n\nfunction getSource() {\n  return selectedProduct; \n}\n\nfunction getPlace() {\n  return selectedPlace; \n}\n\nfunction generateFileName(source, place, timerun, run, date) {\n  return `${date}_${source}_${timerun}_00_00.jpg`;\n}\n\nforwardButton.addEventListener('click', () => {\n  if (currentIndex < fileNames.length - 1) {\n    console.log(\"currIndex: \" + currentIndex);\n    if (selectedProduct === \"ETA\"){\n      currentIndex += 24;\n    } else if (selectedProduct === \"IMPRO\"){\n      currentIndex += 6;\n      const buttons = document.querySelectorAll('#timerun-buttons button');\n      if (currentIndex < buttons.length) {\n        buttons[currentIndex].click();\n        console.log(document.getElementById(currentIndex));\n        document.getElementById(currentIndex).click();\n        updateButtonStyle();\n      }\n    } else {\n    currentIndex++;\n    if (currentIndex >= TIMERUN_BUTTONS_COUNT) currentIndex = TIMERUN_BUTTONS_COUNT - 1;\n    updateButtonStyle();\n    const buttons = document.querySelectorAll('#timerun-buttons button');\n    buttons[currentIndex].click();\n  }\n  }\n});\n\npreviousButton.addEventListener('click', () => {\n  if (currentIndex > 0) {\n    if (selectedProduct === \"ETA\"){\n      currentIndex -= 24;\n      const buttons = document.querySelectorAll('#timerun-buttons button');\n    buttons[currentIndex].click();\n      updateButtonStyle();\n    } else if (selectedProduct === \"IMPRO\"){\n      currentIndex -= 6;\n      const buttons = document.querySelectorAll('#timerun-buttons button');\n      if (currentIndex < buttons.length) {\n        buttons[currentIndex].click();\n        console.log(document.getElementById(currentIndex));\n        document.getElementById(currentIndex).click();\n        updateButtonStyle();\n      }\n    } else {\n    currentIndex--;\n    if (currentIndex < startHour) currentIndex = startHour;\n    updateButtonStyle();\n    const buttons = document.querySelectorAll('#timerun-buttons button');\n    buttons[currentIndex].click();\n    }\n  }\n});\n\nlet playInterval;\nlet isPlaying = false;\nlet timer;\nlet intervalTime = 800;\n\ndocument.getElementById(\"speedInput\").addEventListener(\"input\", (e) => {\n    const newSpeed = parseInt(e.target.value);\n    if (!isNaN(newSpeed) && newSpeed > 0) {\n        intervalTime = newSpeed;\n        if (isPlaying) {\n            clearInterval(timer);\n            playButton.textContent = 'Start animacji';\n            isPlaying = false;\n            currentIndex = 0;\n            playButton.click(); \/\/ Restart animation with the new speed\n        }\n    }\n});\n\nplayButton.addEventListener('click', () => {\n  if (!isPlaying) {\n    isPlaying = true;\n    playButton.textContent = 'Zatrzymaj animacj\u0119';\n    timer = setInterval(() => {\n      if (currentIndex < TIMERUN_BUTTONS_COUNT - 1) {\n        currentIndex++;\n        updateButtonStyle();\n        const buttons = document.querySelectorAll('#timerun-buttons button');\n        buttons[currentIndex].click();\n      } else {\n        clearInterval(timer);\n        playButton.textContent = 'Start animacji';\n        isPlaying = false;\n        currentIndex = 0;\n      }\n    }, intervalTime);\n  } else {\n    clearInterval(timer);\n    playButton.textContent = 'Start animacji';\n    isPlaying = false;\n    currentIndex = 0;\n  }\n});\n\ndocument.addEventListener('DOMContentLoaded', function() {\n    const buttonToClickFirst = document.getElementById('button_ETA_0');\n    const buttonToClickSecond = document.getElementById('button_IMPRO_1');\n    const buttonToClick = document.getElementById('button_scnc_2');\n    if (buttonToClick) {\n        setTimeout(function() {\n            buttonToClickFirst.click();\n        }, 1000); \n\n        setTimeout(function() {\n            buttonToClickSecond.click();\n        }, 1100); \n\n        setTimeout(function() {\n            buttonToClick.click();\n        }, 1200); \n    }\n\n    var divToRemove = document.getElementById('site-header-inner');\n\n\/\/ Check if the div exists\nif (divToRemove) {\n    \/\/ Remove the div from its parent node\n    divToRemove.parentNode.removeChild(divToRemove);\n}\n});\n\n    <\/script>\n\n<script>\n  \/\/ Get a reference to the div with ID \"site-header-inner\"\n  var divToRemove = document.getElementById('site-header-inner');\n\n  \/\/ Check if the div exists\n  if (divToRemove) {\n      \/\/ Remove the div from its parent node\n      divToRemove.parentNode.removeChild(divToRemove);\n  }\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Multimodel dyspersji<\/p>\n","protected":false},"author":3,"featured_media":39391,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ocean_post_layout":"","ocean_both_sidebars_style":"","ocean_both_sidebars_content_width":0,"ocean_both_sidebars_sidebars_width":0,"ocean_sidebar":"0","ocean_second_sidebar":"0","ocean_disable_margins":"enable","ocean_add_body_class":"","ocean_shortcode_before_top_bar":"","ocean_shortcode_after_top_bar":"","ocean_shortcode_before_header":"","ocean_shortcode_after_header":"","ocean_has_shortcode":"","ocean_shortcode_after_title":"","ocean_shortcode_before_footer_widgets":"","ocean_shortcode_after_footer_widgets":"","ocean_shortcode_before_footer_bottom":"","ocean_shortcode_after_footer_bottom":"","ocean_display_top_bar":"default","ocean_display_header":"default","ocean_header_style":"","ocean_center_header_left_menu":"0","ocean_custom_header_template":"0","ocean_custom_logo":0,"ocean_custom_retina_logo":0,"ocean_custom_logo_max_width":0,"ocean_custom_logo_tablet_max_width":0,"ocean_custom_logo_mobile_max_width":0,"ocean_custom_logo_max_height":0,"ocean_custom_logo_tablet_max_height":0,"ocean_custom_logo_mobile_max_height":0,"ocean_header_custom_menu":"0","ocean_menu_typo_font_family":"0","ocean_menu_typo_font_subset":"","ocean_menu_typo_font_size":0,"ocean_menu_typo_font_size_tablet":0,"ocean_menu_typo_font_size_mobile":0,"ocean_menu_typo_font_size_unit":"px","ocean_menu_typo_font_weight":"","ocean_menu_typo_font_weight_tablet":"","ocean_menu_typo_font_weight_mobile":"","ocean_menu_typo_transform":"","ocean_menu_typo_transform_tablet":"","ocean_menu_typo_transform_mobile":"","ocean_menu_typo_line_height":0,"ocean_menu_typo_line_height_tablet":0,"ocean_menu_typo_line_height_mobile":0,"ocean_menu_typo_line_height_unit":"","ocean_menu_typo_spacing":0,"ocean_menu_typo_spacing_tablet":0,"ocean_menu_typo_spacing_mobile":0,"ocean_menu_typo_spacing_unit":"","ocean_menu_link_color":"","ocean_menu_link_color_hover":"","ocean_menu_link_color_active":"","ocean_menu_link_background":"","ocean_menu_link_hover_background":"","ocean_menu_link_active_background":"","ocean_menu_social_links_bg":"","ocean_menu_social_hover_links_bg":"","ocean_menu_social_links_color":"","ocean_menu_social_hover_links_color":"","ocean_disable_title":"default","ocean_disable_heading":"default","ocean_post_title":"","ocean_post_subheading":"","ocean_post_title_style":"","ocean_post_title_background_color":"","ocean_post_title_background":0,"ocean_post_title_bg_image_position":"","ocean_post_title_bg_image_attachment":"","ocean_post_title_bg_image_repeat":"","ocean_post_title_bg_image_size":"","ocean_post_title_height":0,"ocean_post_title_bg_overlay":0.5,"ocean_post_title_bg_overlay_color":"","ocean_disable_breadcrumbs":"default","ocean_breadcrumbs_color":"","ocean_breadcrumbs_separator_color":"","ocean_breadcrumbs_links_color":"","ocean_breadcrumbs_links_hover_color":"","ocean_display_footer_widgets":"default","ocean_display_footer_bottom":"default","ocean_custom_footer_template":"0"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.5.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144 - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB<\/title>\n<meta name=\"description\" content=\"Multimodel dyspersji\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cmm.imgw.pl\/?page_id=39380\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IMGW-PIB CMM: Multimodel dyspersji\" \/>\n<meta property=\"og:description\" content=\"IMGW-PIB CMM: Multimodel dyspersji\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cmm.imgw.pl\/?page_id=39380\" \/>\n<meta property=\"og:site_name\" content=\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Meteoimgw\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-06T11:19:36+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/12\/dyspersja.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1302\" \/>\n\t<meta property=\"og:image:height\" content=\"752\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"IMGW-PIB CMM: Multimodel dyspersji\" \/>\n<meta name=\"twitter:description\" content=\"IMGW-PIB CMM: Multimodel dyspersji\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/12\/dyspersja.png\" \/>\n<meta name=\"twitter:site\" content=\"@IMGW_CMM\" \/>\n<meta name=\"twitter:label1\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=39380\",\"url\":\"https:\/\/cmm.imgw.pl\/?page_id=39380\",\"name\":\"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144 - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"isPartOf\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#website\"},\"datePublished\":\"2023-12-28T13:33:32+00:00\",\"dateModified\":\"2025-06-06T11:19:36+00:00\",\"description\":\"Multimodel dyspersji\",\"breadcrumb\":{\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=39380#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cmm.imgw.pl\/?page_id=39380\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cmm.imgw.pl\/?page_id=39380#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cmm.imgw.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cmm.imgw.pl\/#website\",\"url\":\"https:\/\/cmm.imgw.pl\/\",\"name\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"description\":\"CMOK-LMM Laboratorium pe\u0142ni pa\u0144stwow\u0105 s\u0142u\u017cb\u0119 hydrologiczno-meteorologiczn\u0105 w zakresie numerycznych prognoz pogody, kt\u00f3rego zadaniem jest konsolidacja kompetencji w obszarze modelowania zjawisk pogodowych oraz dalszego rozwoju numerycznych modeli pogody (NMP).\",\"publisher\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cmm.imgw.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cmm.imgw.pl\/#organization\",\"name\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\",\"url\":\"https:\/\/cmm.imgw.pl\/\",\"sameAs\":[\"https:\/\/www.facebook.com\/Meteoimgw\/\",\"https:\/\/twitter.com\/IMGW_CMM\"],\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png\",\"contentUrl\":\"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png\",\"width\":1356,\"height\":365,\"caption\":\"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB\"},\"image\":{\"@id\":\"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144 - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","description":"Multimodel dyspersji","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cmm.imgw.pl\/?page_id=39380","og_locale":"pl_PL","og_type":"article","og_title":"IMGW-PIB CMM: Multimodel dyspersji","og_description":"IMGW-PIB CMM: Multimodel dyspersji","og_url":"https:\/\/cmm.imgw.pl\/?page_id=39380","og_site_name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","article_publisher":"https:\/\/www.facebook.com\/Meteoimgw\/","article_modified_time":"2025-06-06T11:19:36+00:00","og_image":[{"width":1302,"height":752,"url":"http:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/12\/dyspersja.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_title":"IMGW-PIB CMM: Multimodel dyspersji","twitter_description":"IMGW-PIB CMM: Multimodel dyspersji","twitter_image":"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2023\/12\/dyspersja.png","twitter_site":"@IMGW_CMM","twitter_misc":{"Szacowany czas czytania":"4 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/cmm.imgw.pl\/?page_id=39380","url":"https:\/\/cmm.imgw.pl\/?page_id=39380","name":"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144 - Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","isPartOf":{"@id":"https:\/\/cmm.imgw.pl\/#website"},"datePublished":"2023-12-28T13:33:32+00:00","dateModified":"2025-06-06T11:19:36+00:00","description":"Multimodel dyspersji","breadcrumb":{"@id":"https:\/\/cmm.imgw.pl\/?page_id=39380#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cmm.imgw.pl\/?page_id=39380"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/cmm.imgw.pl\/?page_id=39380#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cmm.imgw.pl\/"},{"@type":"ListItem","position":2,"name":"IMGW-PIB LMM: Po\u017cary i rozprzestrzenianie si\u0119 ska\u017ce\u0144, multimodel dyspersji zanieczyszcze\u0144"}]},{"@type":"WebSite","@id":"https:\/\/cmm.imgw.pl\/#website","url":"https:\/\/cmm.imgw.pl\/","name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","description":"CMOK-LMM Laboratorium pe\u0142ni pa\u0144stwow\u0105 s\u0142u\u017cb\u0119 hydrologiczno-meteorologiczn\u0105 w zakresie numerycznych prognoz pogody, kt\u00f3rego zadaniem jest konsolidacja kompetencji w obszarze modelowania zjawisk pogodowych oraz dalszego rozwoju numerycznych modeli pogody (NMP).","publisher":{"@id":"https:\/\/cmm.imgw.pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cmm.imgw.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/cmm.imgw.pl\/#organization","name":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB","url":"https:\/\/cmm.imgw.pl\/","sameAs":["https:\/\/www.facebook.com\/Meteoimgw\/","https:\/\/twitter.com\/IMGW_CMM"],"logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/","url":"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png","contentUrl":"https:\/\/cmm.imgw.pl\/wp-content\/uploads\/2025\/10\/MODELE_LOGO_UNIFIKACJA_v2.png","width":1356,"height":365,"caption":"Laboratorium Modelowania Meteorologicznego CMOK IMGW-PIB"},"image":{"@id":"https:\/\/cmm.imgw.pl\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/39380"}],"collection":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=39380"}],"version-history":[{"count":56,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/39380\/revisions"}],"predecessor-version":[{"id":45239,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/pages\/39380\/revisions\/45239"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=\/wp\/v2\/media\/39391"}],"wp:attachment":[{"href":"https:\/\/cmm.imgw.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=39380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}