Water Scarcity GFM
Il Gap Filling Module Scarsità Idrica calcola l'impronta della scarsità idrica dei prodotti alimentari combinando dati di consumo idrico specifici del prodotto con indici regionali di stress idrico. Questo approccio tiene conto del fatto che il consumo di acqua in regioni con scarsità idrica ha un impatto ambientale maggiore dello stesso consumo in regioni con abbondanza d'acqua.
Riferimento Rapido
| Proprietà | Descrizione |
|---|---|
| Eseguito su | ModeledActivityNode con genitore FoodProductFlowNode contenente un nome prodotto |
| Dipendenze | OriginGapFillingWorker |
| Input Chiave | Tipo di prodotto (termine FoodEx2), paese di origine |
| Output | Flusso di consumo di acqua scarsa in metri cubi |
| Trigger | Prodotto abbinato a un identificatore di impronta della scarsità idrica |
Quando Viene Eseguito
Il modulo si attiva quando:
- Un
ModeledActivityNodeha un genitoreFoodProductFlowNodecon un nome prodotto - Il prodotto e abbinato a un identificatore di impronta della scarsità idrica nel glossario
- Il modulo e pianificato sul nodo foglia Brightway (all'origine)
Output Chiave
Il modulo aggiunge un flusso di consumo di acqua scarsa al grafo di calcolo:
- Consumo di Acqua Scarsa: Misurato in metri cubi (m3) per chilogrammo di prodotto
- Collegato a un
ElementaryResourceEmissionNodeper il calcolo dell'impatto
Metodologia Scientifica
Il modello di scarsità idrica utilizza fattori dell'Indice di Stress Idrico (WSI) forniti da Scherer e Pfister (2016). Questa metodologia include esplicitamente lo stress idrico regionale come fattore di ponderazione per il consumo di acqua dolce, fornendo una misura ambientalmente più significativa del semplice volume d'acqua.
Approccio dell'Indice di Stress Idrico
L'impronta della scarsità idrica e calcolata usando la formula:
Acqua Scarsa [L/kg] = Consumo di Acqua Blu [L/kg] * Indice di Stress Idrico [adimensionale]
Dove:
- Consumo di Acqua Blu: La quantità di acque superficiali e sotterranee consumate durante la produzione
- Indice di Stress Idrico: Un fattore regionale che rappresenta la scarsità idrica (scala da 0 a 1)
Stress Idrico Regionale
Lo stress idrico dipende da:
- La quantità di acqua consumata in una regione rispetto all'acqua naturalmente disponibile dalle precipitazioni
- Correzioni per l'acqua che viene restituita al bacino idrografico (per esempio, dopo il raffreddamento nella produzione di elettricità)
Il database include fattori di scarsità idrica differenziati per 162 paesi, consentendo valutazioni regionali accurate.
Flusso di Calcolo
Quantita Prodotto [g] -> Converti in [kg] -> Fattore WSI [L acqua scarsa/kg] -> Acqua Scarsa [L]
Il calcolo viene eseguito al livello più basso del grafo è aggregato fino al prodotto principale.
Dettagli di Implementazione
Fonte dei Dati
I fattori di scarsità idrica sono memorizzati in EDB_water_expected_wsi_per_kg_country_excel_corrected.xlsx, che contiene:
- Identificatori prodotto (WS_ID)
- Fattori WSI specifici per paese per 162 paesi
- Valori mediani per calcoli di fallback
Logica di Abbinamento
I prodotti sono abbinati ai dati di scarsità idrica attraverso:
- Termini FoodEx2 dal nome del prodotto
- Collegamenti al glossario che mappano combinazioni di termini a identificatori di scarsità idrica
water_scarcity_term_uid = self.gfm_factory.linked_water_scarcity_terms.get(
frozenset([term.uid for term in parent_flow_product_name_terms])
)
Gestione del Codice Paese
Il modulo gestisce i codici paese come segue:
- Recupera la proprietà
flow_locationdal prodotto o dai nodi genitori - Converte i codici ISO a 3 lettere in codici a 2 lettere usando
iso_3166_map_3_to_2_letter - Cerca il fattore WSI specifico del paese
Comportamento di Fallback
| Scenario | Comportamento |
|---|---|
| Nessuna origine trovata | Usa la mediana di tutti i paesi disponibili |
| Origini multiple trovate | Usa la mediana di tutti i paesi disponibili |
| Origine non nella tabella WSI | Usa la mediana per quel prodotto tra tutti i paesi |
| Prodotto non nella tabella WSI | Scarsità idrica impostata a zero |
| Prodotto senza ID WSI | Scarsità idrica impostata a zero |
Esclusione del Trasporto
Il modulo salta i flussi relativi al trasporto per evitare doppi conteggi:
if product_name_term.sub_class_of == self.gfm_factory.root_transport_term.uid:
transport_term = True
if transport_term:
continue
Gestione dei Prodotti Essiccati
Per gli ingredienti che sono suddivisi in versioni fresche ed essiccate (tramite il Water Loss GFM):
- La scarsità idrica e calcolata per la quantità di ingrediente fresco
- La scarsità idrica e calcolata anche per la quantità di ingrediente fresco corrispondente alla versione essiccata
- Questo tiene correttamente conto della maggiore quantità di prodotto fresco necessaria per produrre versioni essiccate
Modifiche al Grafo
Il modulo esegue le seguenti modifiche al grafo:
Passo 1: Rimuovere l'Arco Originale
remove_edge_mutation = RemoveEdgeMutation(
from_node_uid=parent_flow.uid,
to_node_uid=self.node.uid,
)
Passo 2: Creare l'Attività di Consumo Idrico
water_consumption_activity = FoodProcessingActivityNode.model_construct(
uid=UuidStr(uuid4()),
production_amount=self.node.production_amount.duplicate(),
)
Passo 3: Ristabilire le Connessioni di Flusso
Il modulo crea un nuovo nodo di flusso alimentare tra l'attività di consumo idrico e il nodo Brightway originale.
Passo 4: Aggiungere il Flusso di Acqua Scarsa
scarce_water_consumption_flow = FlowNode.model_construct(
uid=UuidStr(uuid4()),
product_name=NamesProp.unvalidated_construct(
terms=[
GlossaryTermProp.unvalidated_construct(
term_uid=self.gfm_factory.scarce_water_consumption_term.uid
)
]
),
amount_in_original_source_unit=QuantityProp.unvalidated_construct(
# Il segno negativo indica il consumo
value=-production_amount_in_kg * scarce_water_consumption_m3_per_kg,
unit_term_uid=self.gfm_factory.cubic_meter_term.uid,
for_reference=ReferenceAmountEnum.amount_for_activity_production_amount,
),
)
Passo 5: Collegare al Nodo Risorsa Elementare
Il flusso di acqua scarsa e collegato a un ElementaryResourceEmissionNode condiviso per la valutazione dell'impatto.
Riferimento Codice Completo
Logica di Pianificazione del Worker
def should_be_scheduled(self) -> bool:
"""Whether to schedule water scarcity gap filling worker."""
if (
isinstance(self.node, ModeledActivityNode)
and self.node.get_parent_nodes()
and any(
isinstance(parent_node, FoodProductFlowNode) and parent_node.product_name
for parent_node in self.node.get_parent_nodes()
)
):
return True
return False
Verifica della Prontezza all'Esecuzione
def can_run_now(self) -> GapFillingWorkerStatusEnum:
"""Whether water scarcity gap filling worker can be executed."""
global_gfm_state = self.get_global_gfm_state()
# Attendi la determinazione dell'origine
if global_gfm_state.get(OriginGapFillingWorker.__name__, 0) == NodeGfmStateEnum.scheduled.value:
return GapFillingWorkerStatusEnum.reschedule
# Esegui solo sul nodo foglia Brightway
if any(isinstance(sub_node, FoodProductFlowNode) for sub_node in self.node.get_sub_nodes()):
return GapFillingWorkerStatusEnum.cancel
return GapFillingWorkerStatusEnum.ready
Calcolo della Scarsità Idrica
# Converti la quantita di produzione in chilogrammi
production_amount_unit: Term = self.node.production_amount.get_unit_term()
production_amount_in_kg = UnitWeightConverter.convert_between_same_unit_types(
self.node.production_amount.value,
production_amount_unit,
self.gfm_factory.kilogram_term,
"mass-in-g",
)
# Cerca il fattore specifico del paese
if flow_country_code in water_scarcity_term.data:
scarce_water_consumption_m3_per_kg = water_scarcity_term.data[flow_country_code]
else:
# Fallback alla mediana
scarce_water_consumption_m3_per_kg = water_scarcity_term.data["median"]
# Calcola il consumo di acqua scarsa
scarce_water_value = -production_amount_in_kg * scarce_water_consumption_m3_per_kg
Inizializzazione della Factory
Il WaterScarcityGapFillingFactory inizializza i seguenti dati in cache:
Termini delle Unità
self.cubic_meter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_cubic-meter", root_unit_term.access_group_uid)
)
self.liter_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_liter", root_unit_term.access_group_uid)
)
self.kilogram_term = self.service_provider.glossary_service.get_term_by_xid_ag_uid(
("EOS_kilogram", root_unit_term.access_group_uid)
)
Cache dei Collegamenti al Glossario
water_scarcity_glossary_links = await self.service_provider.glossary_link_service.get_glossary_links_by_gfm(
gap_filling_module="WaterScarcity"
)
for water_scarcity_glossary_link in water_scarcity_glossary_links:
self.linked_water_scarcity_terms[
frozenset(water_scarcity_glossary_link.term_uids)
] = water_scarcity_glossary_link.linked_term_uid
Esempio di Calcolo
Scenario: 500g di pomodori dalla Spagna
Passo 1: Convertire in Chilogrammi
500g = 0,5 kg
Passo 2: Cercare il Fattore WSI
Dal database della scarsità idrica per i pomodori in Spagna:
Fattore WSI = 142,3 L di acqua scarsa/kg
Passo 3: Calcolare l'Acqua Scarsa
Acqua Scarsa = 0,5 kg * 142,3 L/kg = 71,15 L di acqua scarsa
Passo 4: Convertire in Metri Cubi
71,15 L = 0,07115 m3 di acqua scarsa
Confronto per Origine
Gli stessi pomodori da origini diverse avrebbero impatti diversi:
| Origine | Fattore WSI (L/kg) | Acqua Scarsa (L) per 500g |
|---|---|---|
| Spagna | 142,3 | 71,15 |
| Paesi Bassi | 12,8 | 6,40 |
| Marocco | 285,6 | 142,80 |
| Italia | 98,4 | 49,20 |
Questo dimostra perché i fattori di stress idrico specifici dell'origine sono critici per una valutazione ambientale accurata.
Limitazioni Note
Copertura dei Dati
- 162 paesi coperti: La maggior parte dei principali paesi produttori di alimenti e inclusa
- Paesi mancanti: Alcuni paesi potrebbero non avere dati WSI; vengono usati valori mediani come fallback
- Copertura prodotti: Non tutti i prodotti alimentari hanno ID di scarsità idrica assegnati
Limitazioni dell'Ereditarietà
L'implementazione attuale non supporta l'ereditarietà degli ID di scarsità idrica tra prodotti correlati:
- Nel sistema legacy, i prodotti potevano ereditare ID WSI da prodotti collegati
- Nell'implementazione attuale, i prodotti senza un ID WSI diretto ricevono zero scarsità idrica
- Questo può risultare in una sottostima per alcuni prodotti (per esempio, farine speciali che potrebbero ereditare dalla farina generica)
Risoluzione dei Dati
- Solo risoluzione a livello di paese (nessuna differenziazione sub-nazionale)
- Non tiene conto delle variazioni stagionali nello stress idrico
- Usa valori attesi (medi) piuttosto che dati specifici dell'anno reale
Fallback alla Mediana
Quando vengono usati valori mediani (origine sconosciuta, dati paese mancanti), non viene visualizzato alcun avviso nell'output. Questo è un comportamento noto documentato nelle revisioni scientifiche.
Fonti dei Dati
Fonte Primaria
Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.
I dati sulla scarsità idrica combinano:
- Consumo di acqua blu da database Life Cycle Assessment
- Valori dell'Indice di Stress Idrico basati sulla disponibilità idrica a livello di bacino idrografico
Struttura del Database
I fattori di scarsità idrica sono memorizzati nell'Eaternity Database (EDB) con:
water-scarcity-footprint-id: Collega i prodotti alle voci di dati WSI- Valori specifici per paese: Memorizzati per ogni combinazione prodotto-paese
- Valori mediani: Pre-calcolati per scenari di fallback
Riferimenti
-
Scherer, L., & Pfister, S. (2016). Global water footprint assessment of hydropower. Renewable Energy, 99, 711-720.
-
Pfister, S., Koehler, A., & Hellweg, S. (2009). Assessing the environmental impacts of freshwater consumption in LCA. Environmental Science and Technology, 43(11), 4098-4104.
-
Eaternity Database (EDB). Water Scarcity Footprint Data. Internal documentation.